主頁 > 軟體工程 > D3.jsv7-如何使Y軸標簽始終顯示在螢屏上以獲得可滾動圖表

D3.jsv7-如何使Y軸標簽始終顯示在螢屏上以獲得可滾動圖表

2021-10-20 11:42:11 軟體工程

我有一個圖表,它為每個 x 軸專案使用設定的寬度,因此當添加大量日期時,圖表是可滾動的。

我想要做的是讓兩個 Y 軸標簽始終在螢屏上(我不能position: fixed使用 CSS,因為軸是<g>元素。)

如何讓兩個 Y 軸標簽始終顯示在螢屏上?(這是藍色和綠色文本標簽)。這是我的意思的一個例子:https : //observablehq.com/@d3/pannable-chart ) - 不幸的是,該網站上的代碼在我頭上編碼。

let test = (async () => {

  // data source
  const data = JSON.parse(`{
      "2021-11-17":{
         "rawWeight":220,
         "rca":1821
      },
      "2021-05-17":{
         "rawWeight":230,
         "rca":1600
      },
      "2021-03-09":{
         "rawWeight":224,
         "rca":1800
      },
      "2020-10-30":{
         "rawWeight":234.36,
         "rca":2851
      },
      "2020-10-13":{
         "rawWeight":225.54,
         "rca":2541
      },
      "2020-09-25":{
         "rawWeight":225.4,
         "rca":2588
      },
      "2020-1-10":{
         "rawWeight":244,
         "rca":1800
      }
  }`)

  // parse the date / time
  var parseTime = d3.timeParse("%Y-%m-%d");

  //structure dataset
  let dataset = []
  for (let day in data) {
    dataset.push({
      day: day,
      date: parseTime(day),
      weight: Number(data[day].rawWeight),
      calories: data[day].rca
    })
  }

  let margin = {
    top: 10,
    right: 20,
    bottom: 0,
    left: 20
  }
  //let width = document.querySelector('.pane[data-area="weight"] .chart').clientWidth - margin.left - margin.right
  let width = (dataset.length * 230) - margin.left - margin.right
  let height = 150 - margin.top - margin.bottom

  // set the ranges
  let x = d3.scaleTime().range([0, width])
  let y0 = d3.scaleLinear().range([height, 0])
  let y1 = d3.scaleLinear().range([height, 0])

  let linecalories = d3.line()
    .curve(d3.curveCatmullRom)
    .x(d => x(d.date))
    .y(d => y0(d.calories))

  let areacalories = d3.area()
    .curve(d3.curveCatmullRom)
    .x(d => x(d.date))
    .y0(height)
    .y1(d => y0(d.calories))

  let lineweight = d3.line()
    .curve(d3.curveCatmullRom)
    .x(d => x(d.date))
    .y(d => y1(d.weight))

  let areaweight = d3.area()
    .curve(d3.curveCatmullRom)
    .x(d => x(d.date))
    .y0(height)
    .y1(d => y1(d.weight))

  let svg = d3
    .select('.pane[data-area="weight"] .chart')
    .append("svg")
    .attr("width", width   margin.left   margin.right)
    .attr("height", height   margin.top   margin.bottom)
    .append("g")
    .attr("transform", "translate("   margin.left   ","   margin.top   ")")

  // Scale the range of the data
  x.domain(d3.extent(dataset, d => d.date))
  y0.domain([0, d3.max(dataset, (d) => {
    // let rounded = Math.floor( Math.max(d.calories) / 500) * 500
    // return rounded   1000
    return Math.max(d.calories)   500
  })])
  y1.domain([
    // replace this with "0" to show scale from 0
    d3.min(dataset, d => Math.min(d.weight) - 25),
    d3.max(dataset, d => Math.max(d.weight)   25)
  ])







  // gridlines in y axis function
  function make_y_gridlines() {
    return d3.axisLeft(y1)
      .ticks(8)
  }
  svg.append("g")
    .attr("class", "grid-y")
    .call(make_y_gridlines()
      .tickSize(-width)
      .ticks(5)
    )
    .call(g => g.select(".domain").remove())
    .call(g => g.selectAll("text").remove())

  // gridlines in x axis function
  function make_x_gridlines() {
    return d3.axisBottom(x)
      .ticks(20)
  }
  svg.append("g")
    .attr("class", "grid-x")
    .attr("transform", "translate(0,"   height   ")")
    .call(make_x_gridlines()
      .tickSize(-height)
    )
    .call(g => g.select(".domain").remove())
    .call(g => g.selectAll("text").remove())













  // apply weight area
  svg.append("path")
    .data([dataset])
    .attr("class", "area-weight")
    .attr("d", areaweight)

  // apply calories area
  svg.append("path")
    .data([dataset])
    .attr("class", "area-calories")
    .attr("d", areacalories)

  // apply weight line
  svg.append("path")
    .data([dataset])
    .attr("class", "line-weight")
    .attr("d", lineweight)

  // apply calories line
  svg.append("path")
    .data([dataset])
    .attr("class", "line-calories")
    .attr("d", linecalories)


  svg.append("g")
    .attr("class", "axis-dates")
    .attr("transform", "translate(0,"   (height   8)   ")")
    .call(
      d3
      .axisBottom(x)
      .tickSize(0)
      .ticks(d3.utcMonth.every(1))
      .tickSizeOuter(0)
      .tickFormat(d3.timeFormat("%b %Y"))
      .tickPadding(-30)
    )
    .call(g => g.select(".domain").remove())


  // Add the Y0 Axis
  svg.append("g")
    .attr("class", "axis-calories")
    .attr("transform", "translate( "   width   ", 0 )")
    .call(
      d3
      .axisRight()
      .scale(y0)
      .tickSize(0)
      .ticks(height / 30)
      .tickFormat(d => {
        if ((d / 1000) >= 1)
          d = d / 1000   "K";
        return d
      })

    )
    .call(g => g.select(".domain").remove())

  // Add the Y1 Axis
  svg.append("g")
    .attr("class", "axis-weight")
    // .attr("transform", "translate( "   width   ", 0 )")
    .call(
      d3
      .axisLeft()
      .scale(y1)
      .tickSize(0)
      .ticks(height / 30)
    )
    .call(g => g.select(".domain").remove())



  // dates
  // svg.append("g")
  //    .attr("class", "axis-dates")
  //    .attr("transform", "translate(0,"   (height   8)   ")")
  //    .call(
  //        d3
  //            .axisBottom(x)
  //            .ticks(0)
  //            .tickValues(x.domain())
  //            .tickFormat(d3.timeFormat("%b %Y"))
  //            .tickPadding(-30)
  //    )
  //   .call(g => g.select(".domain").remove())
  //   .call(g => g.selectAll("line").remove())
  //   .call(g => g.select(".tick:first-of-type text").attr('transform', 'translate(32,0)'))
  //   .call(g => g.select(".tick:last-of-type text").attr('transform', 'translate(-32,0)'))

  // remove 0 label
  svg.selectAll(".tick text")
    .filter(function(d) {
      return d === 0
    })
    .remove()






  let colors = ['#56ab2f', '#a8e063']
  let grad = svg.append('defs')
    .append('linearGradient')
    .attr('id', 'calorieline')
    .attr('x1', '0%')
    .attr('x2', '100%')
    .attr('y1', '0%')
    .attr('y2', '100%');

  grad.selectAll('stop')
    .data(colors)
    .enter()
    .append('stop')
    .style('stop-color', function(d) {
      return d;
    })
    .attr('offset', function(d, i) {
      return 100 * (i / (colors.length - 1))   '%';
    })

  colors = ['rgba(86, 171, 47, .15)', 'transparent']
  grad = svg.append('defs')
    .append('linearGradient')
    .attr('id', 'greenfade')
    .attr('x1', '0%')
    .attr('x2', '0%')
    .attr('y1', '0%')
    .attr('y2', '100%');

  grad.selectAll('stop')
    .data(colors)
    .enter()
    .append('stop')
    .style('stop-color', function(d) {
      return d;
    })
    .attr('offset', function(d, i) {
      return 100 * (i / (colors.length - 1))   '%';
    })

  colors = ['rgba(32, 120, 227, .15)', 'transparent']
  grad = svg.append('defs')
    .append('linearGradient')
    .attr('id', 'bluefade')
    .attr('x1', '0%')
    .attr('x2', '0%')
    .attr('y1', '0%')
    .attr('y2', '100%');

  grad.selectAll('stop')
    .data(colors)
    .enter()
    .append('stop')
    .style('stop-color', function(d) {
      return d;
    })
    .attr('offset', function(d, i) {
      return 100 * (i / (colors.length - 1))   '%';
    })

  colors = ['#2894f2', '#1d6cdc']
  grad = svg.append('defs')
    .append('linearGradient')
    .attr('id', 'goodbar')
    .attr('x1', '0%')
    .attr('x2', '25%')
    .attr('y1', '0%')
    .attr('y2', '100%');

  grad.selectAll('stop')
    .data(colors)
    .enter()
    .append('stop')
    .style('stop-color', function(d) {
      return d;
    })
    .attr('offset', function(d, i) {
      return 100 * (i / (colors.length - 1))   '%';
    })


});

test();
body {
  background: #1e2546;
  width: 500px;
  display: block;
}

.chart .axis-dates text {
  font-size: .7rem;
  fill: #fff;

}

[data-area=weight] .chart .axis-dates .tick {
  margin-left: -100px;
  left: 10rem;
  position: relative
}

[data-area=weight] .chart .line-calories {
  stroke-linecap: round;
  stroke-width: .2rem;
  stroke: url(#calorieline);
  fill: none
}

[data-area=weight] .chart .area-calories {
  fill: url(#greenfade);
}

[data-area=weight] .chart .area-weight {
  fill: url(#bluefade)
}
[data-area=weight] .chart .axis-calories text {
  fill: url(#calorieline);
  font-size: .6rem;
  font-weight: 500
}

[data-area=weight] .chart .line-weight {
  stroke-linecap: round;
  stroke-width: .2rem;
  stroke: url(#goodbar);
  fill: transparent
}

[data-area=weight] .chart .axis-weight text {
  font-size: .6rem;
  font-weight: 500;
  fill: url(#goodbar);

}

[data-area=weight] .chart .grid-x line,
[data-area=weight] .chart .grid-y line {
  stroke: rgba(0, 0, 0, .1);
  stroke-width: .1rem
}

[data-area=weight] .chart .label-calorie {
  font-size: .7rem
}

[data-area=weight] .chart .legend {
  -webkit-column-count: 2;
  -moz-column-count: 2;
  column-count: 2;
  -webkit-column-gap: .5rem;
  -moz-column-gap: .5rem;
  column-gap: .5rem;
  margin: .3rem auto 0 auto;
  width: 9rem;
  font-size: .9rem;
  text-align: center;
  position: relative
}

[data-area=weight] .chart .legend .i {
  display: block;
  vertical-align: top;
  width: 100%
}

[data-area=weight] .chart .legend .i:before {
  content: '';
  display: inline-block;
  width: .6rem;
  height: .3rem;
  border-radius: 5rem;
  margin-right: .3rem;
  vertical-align: .1rem
}

[data-area=weight] .chart .legend .calorie {
  color: #a7e063
}

[data-area=weight] .chart .legend .calorie:before {
  background: #a7e063
}

[data-area=weight] .chart .legend .weight {
  color: #2482e9
}

[data-area=weight] .chart .legend .weight:before {
  background: #2482e9
}
<!DOCTYPE html>
<html>

  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>JS Bin</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/7.0.4/d3.min.js" integrity="sha512-T 1zstV6Llwh/zH uoc1rJ7Y8tf9N DiC0T3aL0 0blupn5NkBT52Avsa0l XBnftn/14EtxpsztAWsmiAaqfQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
  </head>

  <body>
    <div class="pane" data-area="weight">
      <div class="chart"></div>
    </div>
  </body>

</html>

這是一個 JSFiddle:https ://jsfiddle.net/8h5fxn46/

uj5u.com熱心網友回復:

我將在回答前說通常不建議在同一圖表上使用兩個 y 軸同樣,如果您一次只顯示折線圖的一部分并強迫讀者滾動查看圖表的其余部分,那么他們將更難進行比較并確定整個資料集的趨勢。這樣做需要他們記住當前未顯示的資料是什么樣的。使用畫筆和縮放縮放可能會更好,因為讀者既可以獲得整個折線圖的概覽,也可以關注其中的特定部分。

話雖如此,以下是基于您鏈接到的 Observable 示例,您可以如何在具有兩個 y 軸的圖表上滾動。基本思想是將 y 軸放在一個 SVG 元素中。然后圖表的其余部分將進入另一個 SVG 元素,放置在一個 div 中。div 將處理滾動。我們將兩個 SVG 疊加在一起。

<!-- references https://observablehq.com/@d3/pannable-chart -->
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <script src="https://d3js.org/d3.v7.js"></script>
</head>

<body>
    <div id="chart"></div>

    <script>
      // data prepartion

      const rawData = {
        "2021-11-17": { rawWeight: 220, rca: 1821 },
        "2021-05-17": { rawWeight: 230, rca: 1600 },
        "2021-03-09": { rawWeight: 224, rca: 1800 },
        "2020-10-30": { rawWeight: 234.36, rca: 2851 },
        "2020-10-13": { rawWeight: 225.54, rca: 2541 },
        "2020-09-25": { rawWeight: 225.4, rca: 2588 },
        "2020-1-10": { rawWeight: 244, rca: 1800 },
      };

      const parseTime = d3.timeParse("%Y-%m-%d");

      const dataset = Object.entries(rawData).map(([date, { rawWeight, rca }]) => ({
        date: parseTime(date),
        weight: rawWeight,
        calories: rca,
      }));

      // set up

      const margin = { top: 30, bottom: 30, left: 30, right: 30 };

      const viewableWidth = 600;
      const totalWidth = dataset.length * 230;
      const height = 200;

      const parent = d3.select('#chart');

      const yAxesSvg = parent.append('svg')
          .attr('width', viewableWidth)
          .attr('height', height)
          .style('position', 'absolute')
          .style('pointer-events', 'none')
          .style('z-index', 1);

      const body = parent.append('div')
          .style('overflow-x', 'scroll')
          .style('max-width', `${viewableWidth}px`)
          .style('-webkit-overflow-scrolling', 'touch');

      const mainSvg = body.append('svg')
          .attr('width', totalWidth)
          .attr('height', height)
          .style('display', 'block');

      // scales

      const x = d3.scaleTime()
          .domain(d3.extent(dataset, d => d.date))
          .range([margin.left, totalWidth - margin.right]);

      const yWeight = d3.scaleLinear()
          .domain([0, d3.max(dataset, d => d.weight)])
          .range([height - margin.bottom, margin.top]);

      const yCalories = d3.scaleLinear()
          .domain([0, d3.max(dataset, d => d.calories)])
          .range([height - margin.bottom, margin.top]);

      // line generators

      const weightLine = d3.line()
          .x(d => x(d.date))
          .y(d => yWeight(d.weight));

      const caloriesLine = d3.line()
          .x(d => x(d.date))
          .y(d => yCalories(d.calories));

      // axes

      // x axis
      mainSvg.append('g')
          .attr('transform', `translate(0,${height - margin.bottom})`)
          .call(d3.axisBottom(x)
              .tickSize(0)
              .ticks(d3.timeMonth.every(1))
              .tickSizeOuter(0)
              .tickFormat(d3.timeFormat("%b %Y")))
          .call(g => g.select(".domain").remove());

      // weight axis
      yAxesSvg.append('g')
          .attr('transform', `translate(${margin.left},0)`)
          // add white background rectangle so that the lines won't overlap the axis
          .call(g => g.append('rect')
              .attr('fill', 'white')
              .attr('width', margin.left)
              .attr('x', -margin.left)
              .attr('y', 0)
              .attr('height', height))
          .call(d3.axisLeft(yWeight)
              .tickSize(0)
              .ticks(height / 30))
          .call(g => g.select(".domain").remove())
          // change color of tick labels
          .call(g => g.selectAll('.tick > text').attr('fill', 'blue'))
          // add axis label
          .call(g => g.append('text')
              .attr('fill', 'blue')
              .attr('text-anchor', 'start')
              .attr('dominant-baseline', 'hanging')
              .attr('font-weight', 'bold')
              .attr('y', 0)
              .attr('x', -margin.left)
              .text('Weight'));

      // calories axis
      yAxesSvg.append("g")
          .attr("transform", `translate(${viewableWidth - margin.right},0)`)
          // add white background rectangle so that the lines won't overlap the axis
          .call(g => g.append('rect')
              .attr('fill', 'white')
              .attr('x', 0)
              .attr('width', margin.right)
              .attr('y', 0)
              .attr('height', height))
          .call(d3.axisRight(yCalories)
              .tickSize(0)
              .ticks(height / 30, '~s'))
          // change color of tick labels
          .call(g => g.selectAll('.tick > text').attr('fill', 'green'))
          .call(g => g.select(".domain").remove())
          // add axis label
          .call(g => g.append('text')
              .attr('fill', 'green')
              .attr('text-anchor', 'end')
              .attr('dominant-baseline', 'hanging')
              .attr('font-weight', 'bold')
              .attr('y', 0)
              .attr('x', margin.right)
              .text('Calories'));

      // lines

      mainSvg.append('g')
        .datum(dataset)
        .append('path')
            .attr('stroke', 'blue')
            .attr('fill', 'none')
            .attr('d', weightLine);

      mainSvg.append('g')
        .datum(dataset)
        .append('path')
            .attr('stroke', 'green')
            .attr('fill', 'none')
            .attr('d', caloriesLine);
    </script>
</body>
</html>

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/326037.html

標籤:javascript d3.js

上一篇:d.label在D3折線圖上讀取未定義

下一篇:將networkd3中sankeyNetwork的矩形更改為圓形

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more