feat: 后端全量更新 - 含所有本次需求

- Contract.php: 返回合约账户余额(balance_contract)
- My.php: 地址管理增加BTC/ETH
- AppContract.php: 一键平仓(closeall)
- AppProxy.php: 代理专属注册链接 + 分级权限(L1/L2)
- site.php: 手续费减半(0.018→0.009)
- agent_permission_setup.sql: 代理权限SQL
- crypto_news_crawler.py: 新闻自动采集脚本
This commit is contained in:
li
2026-03-30 20:16:32 +08:00
commit 1b24994e74
6721 changed files with 1308571 additions and 0 deletions
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

+445
View File
@@ -0,0 +1,445 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Tutorial for GraphObject manipulation with GoJS." />
<title>GraphObject Manipulation</title>
<!-- Copyright 1998-2020 by Northwoods Software Corporation. -->
<link href="../assets/css/bootstrap.min.css" rel="stylesheet" >
<!-- custom CSS after bootstrap -->
<link href="../assets/css/main.css" rel="stylesheet" type="text/css"/>
<link href="../assets/css/highlight.css" rel="stylesheet" type="text/css" media="all" />
<script src="../assets/js/highlight.js"></script>
<script src="../release/go.js"></script>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-1506307-5', 'auto');
ga('send', 'pageview');
</script>
</head>
<body>
<!-- non-fixed navbar -->
<nav id="non-fixed-nav" class="navbar navbar-inverse navbar-top">
<div class="container-fluid">
<div class="navbar-header">
<div class="navheader-container">
<div class="navheader-collapse" data-toggle="collapse" data-target="#navbar">
<a id="toplogo" class="navbar-brand" href="../index.html">GoJS</a>
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
</div>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right">
<li><a href="../index.html">Home</a></li>
<li><a href="../learn/index.html">Learn</a></li>
<li><a href="../samples/index.html">Samples</a></li>
<li><a href="../intro/index.html">Intro</a></li>
<li><a href="../api/index.html" target="api">API</a></li>
<li><a href="https://www.nwoods.com/components/evalform.htm">Register</a></li>
<li><a href="../download.html">Download</a></li>
<li><a href="https://forum.nwoods.com/c/gojs">Forum</a></li>
<li><a href="https://www.nwoods.com/contact.html" onclick="ga('send','event','Outbound Link','click','contact');">Contact</a></li>
<li class="buy"><a href="https://www.nwoods.com/sales/index.html" onclick="ga('send','event','Outbound Link','click','buy');">Buy</a></li>
<li class="activate"><a href="https://www.nwoods.com/app/activate.aspx?sku=gojs">Activate</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
<div id="bannertop" class="jumbotron banner">
<div class="container-fluid plr15">
<h1><span>GraphObject Manipulation</span></h1>
</div>
</div>
<div class="container-fluid learn-container">
<h2 id="ProgrammaticallyInteractiveWithNodes">Programmatically interacting with Nodes</h2>
<p>
This guide will show you some basic ways of programmatically interacting with <b>GoJS</b> nodes and links and model data.
Throughout this page, we will use the following diagram setup as our starting point:
</p>
<pre class="lang-js">
var $ = go.GraphObject.make;
myDiagram =
$(go.Diagram, "myDiagramDiv",
{ "undoManager.isEnabled": true });
// define a simple Node template
myDiagram.nodeTemplate =
$(go.Node, "Auto",
$(go.Shape, "Rectangle",
// don't draw any outline
{ stroke: null },
// the Shape.fill comes from the Node.data.color property
new go.Binding("fill", "color")),
$(go.TextBlock,
// leave some space around larger-than-normal text
{ margin: 6, font: "18px sans-serif" },
// the TextBlock.text comes from the Node.data.key property
new go.Binding("text", "key"))
);
myDiagram.model = new go.GraphLinksModel(
[
{ key: "Alpha", color: "lightblue" },
{ key: "Beta", color: "orange" },
{ key: "Gamma", color: "lightgreen" },
{ key: "Delta", color: "pink" }
]);</pre>
<p>
The code produces this Diagram:
</p>
<!-- LIVE -->
<div id="myDiagramDiv" class="diagramStyling" style="width:700px; height:150px"></div>
<script>
function setupDiagram(divname) {
var $ = go.GraphObject.make;
var myDiagram = $(go.Diagram, divname,
{ "undoManager.isEnabled": true });
// define a simple Node template
myDiagram.nodeTemplate =
$(go.Node, "Auto",
$(go.Shape, "Rectangle",
{ stroke: null },
new go.Binding("fill", "color")),
$(go.TextBlock,
{ margin: 6, font: "18px sans-serif" },
new go.Binding("text", "key"))
);
myDiagram.model = new go.GraphLinksModel(
[
{ key: "Alpha", color: "lightblue" },
{ key: "Beta", color: "orange" },
{ key: "Gamma", color: "lightgreen" },
{ key: "Delta", color: "pink" }
]);
return myDiagram;
}
setupDiagram("myDiagramDiv");
</script>
<h2 id="FindingSingleNodesDiagramFindNodeForKey">Finding single nodes: Diagram.findNodeForKey</h2>
<p>
You can use <code>Diagram.findNodeForKey(key)</code> to get a reference to a Node in JavaScript.
Key values in <b>GoJS</b> can be either strings or numbers.
You can then use the Node reference to inspect and manipulate the Node.
</p>
<pre class="lang-js">
var node = myDiagram.findNodeForKey("Alpha");
// Selects the node programmatically, rather than clicking interactively:
myDiagram.select(node);
// Outputs a JavaScript object in the developer console window.
// The format of what is output will differ per browser, but is essentially the object:
// { key: "Alpha", color: "lightblue" }
// plus some internal implementation details.
console.log(node.data);</pre>
<!-- LIVE -->
<div id="myDiagramDiv2" class="diagramStyling" style="width:700px; height:150px"></div>
<script>
var myDiagram = setupDiagram("myDiagramDiv2");
var node = myDiagram.findNodeForKey("Alpha");
myDiagram.select(node);
if (window.console) console.log(node.data);
</script>
<p>
However <code>findNodeForKey</code> may return <code>null</code> if no node data uses that key value.
Also, it only looks at the model data to find a node data that uses the given key value,
from which it finds the corresponding Node in the Diagram.
It does not look at the text values of any TextBlocks that are within the Nodes,
so it can work even if no text is shown at all.
</p>
<p>
Once you have a <code>Node</code>, you can get its key either via the <code>Node.key</code> property or
by looking at its data: <code>someNode.data.key</code>, just as you can look at any of the data properties.
</p>
<h2 id="CollectionsOfNodesAndLinks">Collections of Nodes and Links</h2>
<p>
Diagrams have several properties and methods that return iterators describing collections of Parts.
Both Nodes and Links are kinds of Parts.
<code>Diagram.nodes</code> and <code>Diagram.links</code> return iterators of all Nodes and Links in the Diagram, respectively.
<code>Diagram.selection</code> returns an iterator of selected Parts
(both selected Nodes and selected Links).
</p>
<p>
There are also more specific methods for common operations, such as <code>Diagram.findTreeRoots()</code>
which returns an iterator of all top-level Nodes that have no parent nodes.
</p>
<p>
This next example uses <code>Diagram.nodes</code> and shows how to iterate over the collection.
</p>
<pre class="lang-js">
// Calling Diagram.commit executes the given function between startTransaction and commitTransaction
// calls. That automatically updates the display and allows the effects to be undone.
myDiagram.commit(function(d) { // this Diagram
// iterate over all nodes in Diagram
d.nodes.each(function(node) {
if (node.data.key === "Beta") continue; //skip Beta, just to contrast
node.scale = 0.4; // shrink each node
});
}, "decrease scale");</pre>
<p>As a result we have very scaled-down nodes, except for Beta:</p>
<!-- LIVE -->
<div id="myDiagramDiv3" class="diagramStyling" style="width:700px; height:150px"></div>
<script>
var myDiagram = setupDiagram("myDiagramDiv3");
myDiagram.commit(function(d) { // this Diagram
// iterate over all nodes in Diagram
d.nodes.each(function(node) {
if (node.data.key === "Beta") return; //skip Beta, just to contrast
node.scale = 0.4; // shrink each node
});
}, "decrease scale");
</script>
<h2 id="NamedGraphObjectsAndPanelFindObject">Named GraphObjects and Panel.findObject</h2>
<p>
Often we want to manipulate a property that belongs to one of the Node's elements,
perhaps an element arbitrarily deep in the template.
In our example Diagram, each Node has one Shape,
and if we want to change the color of this Shape directly we would need a reference to it.
To make it possible to find, we can give that Shape a name:
</p>
<pre class="lang-js">
myDiagram.nodeTemplate =
$(go.Node, "Auto",
$(go.Shape, "Rectangle",
{ stroke: null, name: "SHAPE" }, // added the name property
new go.Binding("fill", "color")),
$(go.TextBlock,
{ margin: 6, font: "18px sans-serif" },
new go.Binding("text", "key"))
);</pre>
<p>
Names allow us to easily find GraphObjects inside of Panels
(all Nodes are also Panels) using <code>Panel.findObject</code>,
which will search the visual tree of a Panel starting at that panel.
So when we have a reference to a Node, we can call <code>someNode.findObject("SomeName")</code>
to search through the node for the named object.
It will return a reference to the named GraphObject if it is found, or <code>null</code> otherwise.
</p>
<p>
Using this, we could make an HTML button that changes the fill of the Shape inside of a selected Node:
</p>
<pre class="lang-js">
var selectionButton = document.getElementById("selectionButton");
selectionButton.addEventListener("click", function() {
myDiagram.commit(function(d) {
d.selection.each(function(node) {
var shape = node.findObject("SHAPE");
// If there was a GraphObject in the node named SHAPE, then set its fill to red:
if (shape !== null) {
shape.fill = "red";
}
});
}, "change color");
});</pre>
<!-- LIVE -->
<div id="myDiagramDiv4" class="diagramStyling" style="width:700px; height:150px"></div>
<button id="selectionButton">Select some Nodes; then click here to change Shape.fill inside selected Nodes</button>
<script>
var myDiagram = setupDiagram("myDiagramDiv4");
var selectionButton = document.getElementById("selectionButton");
selectionButton.addEventListener("click", function() {
myDiagram.commit(function(d) {
d.selection.each(function(node) {
var shape = node.findObject("SHAPE");
// If there was a GraphObject in the node named SHAPE, then set its fill to red:
if (shape !== null) {
shape.fill = "red";
}
});
}, "change color");
});
</script>
<h2 id="ChangingProperteisAndUpdatingModelUsingDataBindings">Changing Properties and Updating the Model using Data Bindings</h2>
<p>
Looking again at our Node template, we have the <code>Shape.fill</code>
property data-bound to the "color" property of our Node data:
</p>
<pre class="lang-js">
myDiagram.nodeTemplate =
$(go.Node, "Auto",
$(go.Shape, "Rectangle",
{ stroke: null, name: "SHAPE" },
new go.Binding("fill", "color")), // note this data binding
$(go.TextBlock,
{ margin: 6, font: "18px sans-serif" },
new go.Binding("text", "key"))
);</pre>
<p>
Changing the Shape's <code>fill</code> property inside our node will not,
as the Node template currently stands, update the model data.
</p>
<pre class="lang-js">
var node = myDiagram.findNodeForKey("Alpha");
var shape = node.findObject("SHAPE");
shape.fill = "red";
// outputs "lightblue" - the model has not changed!
console.log(node.data.color);</pre>
<p>
This is undesirable in some cases.
When we want the change to persist after saving and loading,
we will want the model data updated too.
</p>
<p>
However, in some situations this lack of persistence might be a good thing.
For instance if we want the color change for only cosmetic purposes,
such as changing the color of a button when hovering over it with the mouse,
we would not want to modify the model data that might be saved.
</p>
<p>
For now, suppose that we do want to update the model.
The preferred way to do this is to modify the data in the model
and depend on the data binding to automatically update the Shape.
However, we cannot modify the data directly by just setting the JavaScript property.
</p>
<pre class="lang-js" style="border: 6px solid red">
var node = myDiagram.findNodeForKey("Alpha");
// DO NOT DO THIS!
// This would update the data, but GoJS would not be notified
// that this arbitrary JavaScript object has been modified,
// and the associated Node will not be updated appropriately
node.data.color = "red";</pre>
<p>
Instead we should set the data property using the method
<code>Model.set(data, propertyName, propertyValue)</code>.
</p>
<pre class="lang-js" style="border: 6px solid lime">
var node = myDiagram.findNodeForKey("Alpha");
// Model.commit executes the given function within a transaction
myDiagram.model.commit(function(m) { // m == the Model
// This is the safe way to change model data.
// GoJS will be notified that the data has changed
// so that it can update the node in the Diagram
// and record the change in the UndoManager.
m.set(node.data, "color", "red");
}, "change color");
// outputs "red" - the model has changed!
console.log(node.data.color);
// and the user will see the red node</pre>
<div id="myDiagramDiv5" class="diagramStyling" style="width:700px; height:150px"></div>
<script>
var myDiagram = setupDiagram("myDiagramDiv5");
var node = myDiagram.findNodeForKey("Alpha");
// Model.commit executes the given function within a transaction
myDiagram.model.commit(function(m) { // m == the Model
// This is the safe way to change model data.
// GoJS will be notified that the data has changed
// so that it can update the node in the Diagram
// and record the change in the UndoManager.
m.set(node.data, "color", "red");
}, "change color");
</script>
<p>
Note that there is no longer any need to name the Shape "SHAPE",
because there is no longer any need to call <code>findObject</code> to look for the particular Shape.
Data binding will automatically update properties, so we do not have to do that ourselves.
</p>
<pre class="lang-js">
myDiagram.nodeTemplate =
$(go.Node, "Auto",
$(go.Shape, "Rectangle",
{ stroke: null }, // removed the name property
new go.Binding("fill", "color")),
$(go.TextBlock,
{ margin: 6, font: "18px sans-serif" },
new go.Binding("text", "key"))
);</pre>
<h2 id="SubjectMentionedAndFurtherReading">Subjects Mentioned and Further Reading</h2>
<ul>
<li>Data Binding — See the <a href="../intro/dataBinding.html">intro page on Data Binding for lots more detail</a>.</li>
<li>Transactions — See the <a href="../intro/transactions.html">intro page on Transactions</a>.</li>
<li>
<code>console.log</code> — A powerful debugging aid that is part of most browser's developer tools.
See the <a href="https://developers.google.com/chrome-developer-tools/docs/console">Chrome guide</a> or
the <a href="https://developer.mozilla.org/en-US/docs/Tools/Browser_Console">Firefox guide</a> for their respective developer consoles.
See more suggestions for debugging GoJS diagrams at the <a href="../intro/debugging.html">intro page on Debugging</a>.
</li>
</ul>
<p>
You may want to read more tutorials, such as the <a href="index.html">Learn GoJS</a> tutorial.
and the <a href="interactivity.html">Interactivity</a> tutorial.
You can also watch tutorials on <a href="https://www.youtube.com/channel/UC9We8EoX596-6XFjJDtZIDg">YouTube</a>.
</p>
<p>
If you are ready for a comprehensive overview of <b>GoJS</b>, have a look at the <a href="../intro/index.html">technical introduction</a>.
If you want to explore by example, have a look at <a href="../samples/index.html">the samples</a> to get a feel for what's possible with <b>GoJS</b>.
</p>
<p class="footer">
GoJS &reg; by Northwoods Software. Copyright &copy; 1998-2020 <a href="https://www.nwoods.com" target="_blank">Northwoods Software</a> &reg;
</p>
</div> <!-- end main -->
<div class="banner" id="bannerbottom">
<!-- text in banner-->
</div>
<script src="../assets/js/jquery.min.js"></script>
<script async src="../assets/js/bootstrap.min.js"></script>
</body>
</html>
+824
View File
@@ -0,0 +1,824 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Tutorial for getting started with GoJS." />
<title>Get Started with GoJS</title>
<!-- Copyright 1998-2020 by Northwoods Software Corporation. -->
<link href="../assets/css/bootstrap.min.css" rel="stylesheet" >
<!-- custom CSS after bootstrap -->
<link href="../assets/css/main.css" rel="stylesheet" type="text/css"/>
<link href="../assets/css/highlight.css" rel="stylesheet" type="text/css" media="all" />
<script src="../assets/js/highlight.js"></script>
<script src="../release/go.js"></script>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-1506307-5', 'auto');
ga('send', 'pageview');
</script>
</head>
<body>
<!-- non-fixed navbar -->
<nav id="non-fixed-nav" class="navbar navbar-inverse navbar-top">
<div class="container-fluid">
<div class="navbar-header">
<div class="navheader-container">
<div class="navheader-collapse" data-toggle="collapse" data-target="#navbar">
<a id="toplogo" class="navbar-brand" href="../index.html">GoJS</a>
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
</div>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right">
<li><a href="../index.html">Home</a></li>
<li><a href="../learn/index.html">Learn</a></li>
<li><a href="../samples/index.html">Samples</a></li>
<li><a href="../intro/index.html">Intro</a></li>
<li><a href="../api/index.html" target="api">API</a></li>
<li><a href="https://www.nwoods.com/components/evalform.htm">Register</a></li>
<li><a href="../download.html">Download</a></li>
<li><a href="https://forum.nwoods.com/c/gojs">Forum</a></li>
<li><a href="https://www.nwoods.com/contact.html" onclick="ga('send','event','Outbound Link','click','contact');">Contact</a></li>
<li class="buy"><a href="https://www.nwoods.com/sales/index.html" onclick="ga('send','event','Outbound Link','click','buy');">Buy</a></li>
<li class="activate"><a href="https://www.nwoods.com/app/activate.aspx?sku=gojs">Activate</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
<div id="bannertop" class="jumbotron banner">
<div class="container-fluid plr15">
<h1><span>Get Started with GoJS</span></h1>
</div>
</div>
<div class="container-fluid learn-container">
<h2 id="GoJSTutorials">GoJS Tutorials</h2>
<p>
For video tutorials, see our <a href="https://www.nwoods.com/videos.html">YouTube videos</a>.
For textual tutorials, read on.
</p>
<p>
<b>GoJS</b> is a JavaScript library for implementing interactive diagrams.
This page will show you the essentials of using <b>GoJS</b>.
</p>
<p>
Because <b>GoJS</b> is a JavaScript library that depends on HTML5 features,
you will need to make sure that your page declares that it is an HTML5 document.
And of course you need to load the library:
</p>
<pre class="lang-html">
&lt;!DOCTYPE html&gt; &lt;!-- HTML5 document type --&gt;
&lt;html&gt;
&lt;head&gt;
&lt;!-- use go-debug.js when developing and go.js when deploying --&gt;
&lt;script src="go-debug.js"&gt;&lt;/script&gt;
. . .
</pre>
<p>
You can download <b>GoJS</b> and all the documentation and samples from <a target="_blank" href="../download.html">here</a>.
Alternatively you can link straight to a <b>GoJS</b> library provided by a
<a target="_blank" href="https://developer.mozilla.org/en-US/docs/Glossary/CDN">CDN</a> such as:
<pre class="lang-html">&lt;script src="https://unpkg.com/gojs/release/go-debug.js"&gt;&lt;/script&gt;</pre>
<p>
Each <b>GoJS</b> diagram is contained in an HTML <code>&lt;div&gt;</code> element in your
HTML page that you give an explicit size:
</p>
<pre class="lang-html">
&lt;!-- The DIV for a Diagram needs an explicit size or else we will not see anything.
In this case we also add a background color so we can see that area. --&gt;
&lt;div id="myDiagramDiv"
style="width:400px; height:150px; background-color: #DAE4E4;"&gt;&lt;/div&gt;
</pre>
<p>
In JavaScript code you pass the <code>&lt;div&gt;</code>'s <code>id</code> when making a Diagram:
</p>
<pre class="lang-js">
var $ = go.GraphObject.make;
var myDiagram =
$(go.Diagram, "myDiagramDiv");
</pre>
<p>
Together, this creates an empty diagram:
</p>
<!-- LIVE -->
<div id="myDiagramDiv" class="diagramStyling" style="width:400px; height:150px"></div>
<script>
var $ = go.GraphObject.make;
var myDiagram = $(go.Diagram, "myDiagramDiv");
</script>
<p>
Notice that <code>go</code> is the "namespace" in which all <b>GoJS</b> types reside.
All code uses of <b>GoJS</b> classes such as Diagram or Node or Panel or Shape or TextBlock
will be prefixed with "<code>go.</code>".
</p>
<p>
This article will show you by example how to use <code>go.GraphObject.make</code> to build <b>GoJS</b> objects.
For more detail, read <a href="../intro/buildingObjects.html">Building Objects in GoJS</a>.
Using <code>$</code> as an abbreviation for <code>go.GraphObject.make</code>
is so handy that we will assume its use from now on.
If you use <code>$</code> for something else in your code,
you can always pick a different short variable name,
such as <code>$$</code> or <code>MAKE</code> or <code>GO</code>.
</p>
<h2 id="DiagramsAndModels">Diagrams and Models</h2>
<p>
The Nodes and Links of a Diagram are visualizations of data that is managed by a Model.
<b>GoJS</b> has a model-view architecture,
where Models hold the data (arrays of JavaScript objects) that describe nodes and links,
and Diagrams act as views to visualize this data using actual Node and Link objects.
Models, not Diagrams, are what you load and then save after editing.
You add whatever properties you need for your app on the data objects in the model;
you do not add properties to or modify the prototype of the Diagram and GraphObject classes.
</p>
<p>
Here's an example of a Model and Diagram, followed by the actual diagram it generates:
</p>
<pre class="lang-js">
var $ = go.GraphObject.make;
var myDiagram =
$(go.Diagram, "myDiagramDiv",
{ // enable Ctrl-Z to undo and Ctrl-Y to redo
"undoManager.isEnabled": true
});
var myModel = $(go.Model);
// for each object in this Array, the Diagram creates a Node to represent it
myModel.nodeDataArray = [
{ key: "Alpha" },
{ key: "Beta" },
{ key: "Gamma" }
];
myDiagram.model = myModel;
</pre>
<!-- LIVE -->
<div id="myDiagramDiv2" class="diagramStyling" style="width:400px; height:150px"></div>
<script>
var $ = go.GraphObject.make;
var myDiagram =
$(go.Diagram, "myDiagramDiv2",
{ // enable Ctrl-Z to undo and Ctrl-Y to redo
"undoManager.isEnabled": true
});
var myModel = $(go.Model);
// for each object in this Array, the Diagram creates a Node to represent it
myModel.nodeDataArray = [
{ key: "Alpha" },
{ key: "Beta" },
{ key: "Gamma" }
];
myDiagram.model = myModel;
</script>
<p>
The diagram displays the three nodes that are in the model. Some interaction is already possible:
</p>
<ul>
<li>Click and drag the background in the above diagram to pan the view.</li>
<li>Click a node to select it, or press down on and drag a node to move it around.</li>
<li>To create a selection box, click and hold on the background, then start dragging.</li>
<li>Use CTRL-C and CTRL-V, or control-drag-and-drop, to make a copy of the selection.</li>
<li>
Press the Delete key to delete selected nodes.
(Read about more <a href="../intro/commands.html">Keyboard Commands</a>.)
</li>
<li>
On touch devices, press and hold to bring up a context menu.
(Read about <a href="../intro/contextMenus.html">Context Menus</a>.)
</li>
<li>Since the undo manager was enabled, CTRL-Z and CTRL-Y will undo and redo moves and copies and deletions.</li>
</ul>
<h2 id="StylingNodes">Styling Nodes</h2>
<p>
Nodes are styled by creating templates consisting of GraphObjects and setting properties on those objects.
To create a <a href="../intro/nodes.html">Node</a>, we have several building block classes at our disposal:
</p>
<ul>
<li><a href="../intro/shapes.html">Shape</a>, to display pre-defined or custom geometry with colors</li>
<li><a href="../intro/textblocks.html">TextBlock</a>, to display (potentially editable) text in various fonts</li>
<li><a href="../intro/pictures.html">Picture</a>, to display images, including SVG files</li>
<li>
<a href="../intro/panels.html">Panel</a>, containers to hold a collection of other objects that
can be positioned and sized in different manners according to the type of the Panel (like tables,
vertical stacks, and stretching containers)
</li>
</ul>
<p>
All of these building blocks are derived from the
<a href="../api/symbols/GraphObject.html">GraphObject</a> abstract class,
so we casually refer to them as GraphObjects or objects or elements.
Note that a GraphObject is <em>not</em> an HTML DOM element, so much less overhead in
creating or modifying such objects.
</p>
<p>
We want the model data properties to affect our Nodes, and this is done by way of data bindings.
Data bindings allow us to change the appearance and behavior of GraphObjects in Nodes by automatically setting
properties on those GraphObjects to values that are taken from the model data.
The model data objects are plain JavaScript objects.
You can choose to use whatever property names you like on the node data in the model.
</p>
<p>
The default Node template is simple: A Node which contains one TextBlock.
There is a data binding between a TextBlock's <code>text</code> property and
the model data's <code>key</code> property.
In code, the template looks something like this:
</p>
<pre class="lang-js">
myDiagram.nodeTemplate =
$(go.Node,
$(go.TextBlock,
// TextBlock.text is bound to Node.data.key
new go.Binding("text", "key"))
);
</pre>
<p>
TextBlocks, Shapes, and Pictures are the primitive building blocks of <b>GoJS</b>.
TextBlocks cannot contain images; Shapes cannot contain text.
If you want your node to show some text, you must use a TextBlock.
If you want to draw or fill some geometrical figures, you must use a Shape.
</p>
<p>
More generally, the skeleton of a Node template will look something like this:
</p>
<pre class="lang-js">
myDiagram.nodeTemplate =
$(go.Node, "Vertical", // second argument of a Node (or any Panel) can be a Panel type
/* set Node properties here */
{ // the Node.location point will be at the center of each node
locationSpot: go.Spot.Center
},
/* add Bindings here */
// example Node binding sets Node.location to the value of Node.data.loc
new go.Binding("location", "loc"),
/* add GraphObjects contained within the Node */
// this Shape will be vertically above the TextBlock
$(go.Shape,
"RoundedRectangle", // string argument can name a predefined figure
{ /* set Shape properties here */ },
// example Shape binding sets Shape.figure to the value of Node.data.fig
new go.Binding("figure", "fig")),
$(go.TextBlock,
"default text", // string argument can be initial text string
{ /* set TextBlock properties here */ },
// example TextBlock binding sets TextBlock.text to the value of Node.data.text
new go.Binding("text"))
);
</pre>
<p>
The nesting of GraphObjects within Panels can be arbitrarily deep,
and every class has its own unique set of properties to utilize,
but this shows the general idea.
</p>
<p>
Now that we have seen how to make a Node template, let's see a live example.
We will make a simple template commonly seen in organizational diagrams — an image next to a name.
Consider the following Node template:
</p>
<ul>
<li>
A Node of "Horizontal" Panel type, meaning that its elements will be laid out horizontally side-by-side.
It has two elements:
<ul>
<li>A Picture for the portrait, with the image source data bound</li>
<li>A TextBlock for the name, with the text data bound</li>
</ul>
</li>
</ul>
<pre class="lang-js">
var $ = go.GraphObject.make;
var myDiagram =
$(go.Diagram, "myDiagramDiv",
{ // enable Ctrl-Z to undo and Ctrl-Y to redo
"undoManager.isEnabled": true
});
// define a simple Node template
myDiagram.nodeTemplate =
$(go.Node, "Horizontal",
// the entire node will have a light-blue background
{ background: "#44CCFF" },
$(go.Picture,
// Pictures should normally have an explicit width and height.
// This picture has a red background, only visible when there is no source set
// or when the image is partially transparent.
{ margin: 10, width: 50, height: 50, background: "red" },
// Picture.source is data bound to the "source" attribute of the model data
new go.Binding("source")),
$(go.TextBlock,
"Default Text", // the initial value for TextBlock.text
// some room around the text, a larger font, and a white stroke:
{ margin: 12, stroke: "white", font: "bold 16px sans-serif" },
// TextBlock.text is data bound to the "name" property of the model data
new go.Binding("text", "name"))
);
var model = $(go.Model);
model.nodeDataArray =
[ // note that each node data object holds whatever properties it needs;
// for this app we add the "name" and "source" properties
{ name: "Don Meow", source: "cat1.png" },
{ name: "Copricat", source: "cat2.png" },
{ name: "Demeter", source: "cat3.png" },
{ /* Empty node data */ }
];
myDiagram.model = model;
</pre>
<p>That code produces this diagram:</p>
<!-- LIVE -->
<div id="myDiagramDiv3" class="diagramStyling" style="width:700px; height:200px"></div>
<script>
var $ = go.GraphObject.make;
var myDiagram =
$(go.Diagram, "myDiagramDiv3",
{ // enable Ctrl-Z to undo and Ctrl-Y to redo
"undoManager.isEnabled": true
});
// define a simple Node template
myDiagram.nodeTemplate =
$(go.Node, "Horizontal",
// the entire node will have a light-blue background
{ background: "#44CCFF" },
$(go.Picture,
// Pictures should normally have an explicit width and height.
// This picture has a red background, only visible when there is no source set
// or when the image is partially transparent.
{ margin: 10, width: 50, height: 50, background: "red" },
// Picture.source is data bound to the "source" attribute of model data:
new go.Binding("source")),
$(go.TextBlock,
"Default Text", // the initial value for TextBlock.text
// some room around the text, a larger font, and a white stroke
{ margin: 12, stroke: "white", font: "bold 16px sans-serif" },
// TextBlock.text is data bound to the "name" property of model data:
new go.Binding("text", "name"))
);
var model = $(go.Model);
model.nodeDataArray =
[ // note that each node data object holds whatever properties it needs;
// for this app we add the "name" and "source" properties
{ name: "Don Meow", source: "cat1.png" },
{ name: "Copricat", source: "cat2.png" },
{ name: "Demeter", source: "cat3.png" },
{ /* Empty node data */ }
];
myDiagram.model = model;
</script>
<p>
We may want to show some "default" state when not all information is present,
for instance when an image does not load or when a name is not known.
The "empty" node data in this example is used to show that node templates can work
perfectly well without any of the properties on the bound data.
</p>
<h2 id="KindsOfNodes">Kinds of Models</h2>
<p>
With a custom node template our diagram is becoming a pretty sight, but perhaps we want to show more.
Perhaps we want an organizational chart to show that Don Meow is really the boss of a cat cartel.
So we will create a complete organization chart diagram by adding some Links to show the relationship
between individual nodes and a Layout to automatically position the nodes.
</p>
<p>
In order to get links into our diagram, the basic <code>Model</code> is not going to cut it.
We are going to have to pick one of the other two models in <b>GoJS</b>, both of which support Links.
These are <code>GraphLinksModel</code> and <code>TreeModel</code>.
(Read more about models <a href="../intro/usingModels.html">here</a>.)
</p>
<p>
In GraphLinksModel, we have a <code>model.linkDataArray</code> in addition to the <code>model.nodeDataArray</code>.
It holds an array of JavaScript objects, each describing a link by specifying the "to" and "from" node keys.
Here's an example where node A links to node B and where node B links to node C:
</p>
<pre class="lang-js">
var model = $(go.GraphLinksModel);
model.nodeDataArray =
[
{ key: "A" },
{ key: "B" },
{ key: "C" }
];
model.linkDataArray =
[
{ from: "A", to: "B" },
{ from: "B", to: "C" }
];
myDiagram.model = model;
</pre>
<p>
A GraphLinksModel allows you to have any number of links between nodes, going in any direction.
There could be ten links running from A to B, and three more running the opposite way, from B to A.
</p>
<p>
A TreeModel works a little differently.
Instead of maintaining a separate array of link data,
the links in a tree model are created by specifying a "parent" for a node data.
Links are then created from this association.
Here's the same example done as a TreeModel, with node A linking to node B and node B linking to node C:
</p>
<pre class="lang-js">
var model = $(go.TreeModel);
model.nodeDataArray =
[
{ key: "A" },
{ key: "B", parent: "A" },
{ key: "C", parent: "B" }
];
myDiagram.model = model;
</pre>
<p>
TreeModel is simpler than GraphLinksModel, but it cannot make arbitrary link relationships,
such as multiple links between the same two nodes, or having multiple parents.
Our organizational diagram is a simple hierarchical tree-like structure,
so we will choose TreeModel for this example.
</p>
<p>
First, we will complete the data by adding a few more nodes, using a TreeModel,
and specifying keys and parents in the data.
</p>
<pre class="lang-js">
var $ = go.GraphObject.make;
var myDiagram =
$(go.Diagram, "myDiagramDiv",
{ "undoManager.isEnabled": true });
// the template we defined earlier
myDiagram.nodeTemplate =
$(go.Node, "Horizontal",
{ background: "#44CCFF" },
$(go.Picture,
{ margin: 10, width: 50, height: 50, background: "red" },
new go.Binding("source")),
$(go.TextBlock, "Default Text",
{ margin: 12, stroke: "white", font: "bold 16px sans-serif" },
new go.Binding("text", "name"))
);
var model = $(go.TreeModel);
model.nodeDataArray =
[ // the "key" and "parent" property names are required,
// but you can add whatever data properties you need for your app
{ key: "1", name: "Don Meow", source: "cat1.png" },
{ key: "2", parent: "1", name: "Demeter", source: "cat2.png" },
{ key: "3", parent: "1", name: "Copricat", source: "cat3.png" },
{ key: "4", parent: "3", name: "Jellylorum", source: "cat4.png" },
{ key: "5", parent: "3", name: "Alonzo", source: "cat5.png" },
{ key: "6", parent: "2", name: "Munkustrap", source: "cat6.png" }
];
myDiagram.model = model;
</pre>
<!-- LIVE -->
<div id="myDiagramDiv4" class="diagramStyling" style="width:700px; height:200px"></div>
<script>
var $ = go.GraphObject.make;
var myDiagram =
$(go.Diagram, "myDiagramDiv4",
{ "undoManager.isEnabled": true });
// the template we defined earlier
myDiagram.nodeTemplate =
$(go.Node, "Horizontal",
{ background: "#44CCFF" },
$(go.Picture,
{ margin: 10, width: 50, height: 50, background: "red" },
new go.Binding("source")),
$(go.TextBlock, "Default Text",
{ margin: 12, stroke: "white", font: "bold 16px sans-serif" },
new go.Binding("text", "name"))
);
var model = $(go.TreeModel);
model.nodeDataArray =
[
{ key: "1", name: "Don Meow", source: "cat1.png" },
{ key: "2", parent: "1", name: "Demeter", source: "cat2.png" },
{ key: "3", parent: "1", name: "Copricat", source: "cat3.png" },
{ key: "4", parent: "3", name: "Jellylorum", source: "cat4.png" },
{ key: "5", parent: "3", name: "Alonzo", source: "cat5.png" },
{ key: "6", parent: "2", name: "Munkustrap", source: "cat6.png" }
];
myDiagram.model = model;
</script>
<h2 id="DiagramLayouts">Diagram Layouts</h2>
<p>
As you can see the TreeModel automatically creates the necessary Links to associate the Nodes,
but it's hard to tell whose parent is who.
</p>
<p>
Diagrams have a default layout which takes all nodes that do not have a location and gives them locations,
arranging them in a grid.
We could explicitly give each of our nodes a location to sort out this organizational mess,
but as an easier solution in our case, we will use a layout that gives us good locations automatically.
</p>
<p>
We want to show a hierarchy, and are already using a TreeModel, so the most natural layout choice is TreeLayout.
TreeLayout defaults to flowing from left to right, so to get it to flow from top to bottom
(as is common in organizational diagrams), we will set the <code>angle</code> property to 90.
</p>
<p>
Using layouts in <b>GoJS</b> is usually simple.
Each kind of layout has a number of properties that affect the results.
There are samples for each layout (like <a href="../samples/tLayout.html">TreeLayout Demo</a>)
that showcase its properties.
</p>
<pre class="lang-js">
// define a TreeLayout that flows from top to bottom
myDiagram.layout =
$(go.TreeLayout,
{ angle: 90, layerSpacing: 35 });
</pre>
<p>
<b>GoJS</b> has several other layouts, which you can read about <a href="../intro/layouts.html">here</a>.
</p>
<p>
Adding the layout to the diagram and model so far, we can see our results:
</p>
<pre class="lang-js">
var $ = go.GraphObject.make;
var myDiagram =
$(go.Diagram, "myDiagramDiv",
{
"undoManager.isEnabled": true,
layout: $(go.TreeLayout, // specify a Diagram.layout that arranges trees
{ angle: 90, layerSpacing: 35 })
});
// the template we defined earlier
myDiagram.nodeTemplate =
$(go.Node, "Horizontal",
{ background: "#44CCFF" },
$(go.Picture,
{ margin: 10, width: 50, height: 50, background: "red" },
new go.Binding("source")),
$(go.TextBlock, "Default Text",
{ margin: 12, stroke: "white", font: "bold 16px sans-serif" },
new go.Binding("text", "name"))
);
var model = $(go.TreeModel);
model.nodeDataArray =
[
{ key: "1", name: "Don Meow", source: "cat1.png" },
{ key: "2", parent: "1", name: "Demeter", source: "cat2.png" },
{ key: "3", parent: "1", name: "Copricat", source: "cat3.png" },
{ key: "4", parent: "3", name: "Jellylorum", source: "cat4.png" },
{ key: "5", parent: "3", name: "Alonzo", source: "cat5.png" },
{ key: "6", parent: "2", name: "Munkustrap", source: "cat6.png" }
];
myDiagram.model = model;
</pre>
<!-- LIVE -->
<div id="myDiagramDiv5" class="diagramStyling" style="width:700px; height:400px"></div>
<script>
var $ = go.GraphObject.make;
var myDiagram =
$(go.Diagram, "myDiagramDiv5",
{
"undoManager.isEnabled": true,
layout: $(go.TreeLayout, // specify a Diagram.layout that arranges trees
{ angle: 90, layerSpacing: 35 })
});
// the template we defined earlier
myDiagram.nodeTemplate =
$(go.Node, "Horizontal",
{ background: "#44CCFF" },
$(go.Picture,
{ margin: 10, width: 50, height: 50, background: "red" },
new go.Binding("source")),
$(go.TextBlock, "Default Text",
{ margin: 12, stroke: "white", font: "bold 16px sans-serif" },
new go.Binding("text", "name"))
);
var model = $(go.TreeModel);
model.nodeDataArray =
[
{ key: "1", name: "Don Meow", source: "cat1.png" },
{ key: "2", parent: "1", name: "Demeter", source: "cat2.png" },
{ key: "3", parent: "1", name: "Copricat", source: "cat3.png" },
{ key: "4", parent: "3", name: "Jellylorum", source: "cat4.png" },
{ key: "5", parent: "3", name: "Alonzo", source: "cat5.png" },
{ key: "6", parent: "2", name: "Munkustrap", source: "cat6.png" }
];
myDiagram.model = model;
</script>
<p>
Our diagram is starting to look like a proper organization chart, but we could do better with the links.
</p>
<h2 id="LinkTemplates">Link Templates</h2>
<p>
We will construct a new Link template that will better suit our wide, boxy nodes.
A <a href="../intro/links.html">Link</a> is a different kind of Part, not like a Node.
The main element of a Link is the Link's shape,
and must be a Shape that will have its geometry computed dynamically by <b>GoJS</b>.
Our link is going to consist of just this shape,
with its stroke a little thicker than normal and dark gray instead of black.
Unlike the default link template we will not have an arrowhead.
And we will change the Link <code>routing</code> property from Normal to Orthogonal,
and give it a <code>corner</code> value so that right-angle turns are rounded.
</p>
<pre class="lang-js">
// define a Link template that routes orthogonally, with no arrowhead
myDiagram.linkTemplate =
$(go.Link,
// default routing is go.Link.Normal
// default corner is 0
{ routing: go.Link.Orthogonal, corner: 5 },
// the link path, a Shape
$(go.Shape, { strokeWidth: 3, stroke: "#555" })
// if we wanted an arrowhead we would also add another Shape with toArrow defined:
// $(go.Shape, { toArrow: "Standard", stroke: null }
);
</pre>
<p>
Combining our Link template with our Node template, TreeModel, and TreeLayout,
we finally have a full organization diagram.
The complete code is repeated below, and the resulting diagram follows:
</p>
<pre class="lang-js">
var $ = go.GraphObject.make;
var myDiagram =
$(go.Diagram, "myDiagramDiv",
{
"undoManager.isEnabled": true,
layout: $(go.TreeLayout,
{ angle: 90, layerSpacing: 35 })
});
// the template we defined earlier
myDiagram.nodeTemplate =
$(go.Node, "Horizontal",
{ background: "#44CCFF" },
$(go.Picture,
{ margin: 10, width: 50, height: 50, background: "red" },
new go.Binding("source")),
$(go.TextBlock, "Default Text",
{ margin: 12, stroke: "white", font: "bold 16px sans-serif" },
new go.Binding("text", "name"))
);
// define a Link template that routes orthogonally, with no arrowhead
myDiagram.linkTemplate =
$(go.Link,
{ routing: go.Link.Orthogonal, corner: 5 },
$(go.Shape, // the link's path shape
{ strokeWidth: 3, stroke: "#555" }));
var model = $(go.TreeModel);
model.nodeDataArray =
[
{ key: "1", name: "Don Meow", source: "cat1.png" },
{ key: "2", parent: "1", name: "Demeter", source: "cat2.png" },
{ key: "3", parent: "1", name: "Copricat", source: "cat3.png" },
{ key: "4", parent: "3", name: "Jellylorum", source: "cat4.png" },
{ key: "5", parent: "3", name: "Alonzo", source: "cat5.png" },
{ key: "6", parent: "2", name: "Munkustrap", source: "cat6.png" }
];
myDiagram.model = model;
</pre>
<!-- LIVE -->
<div id="myDiagramDiv6" class="diagramStyling" style="width:700px; height:400px"></div>
<script>
var $ = go.GraphObject.make;
var myDiagram =
$(go.Diagram, "myDiagramDiv6",
{
"undoManager.isEnabled": true, // enable Ctrl-Z to undo and Ctrl-Y to redo
layout: $(go.TreeLayout,
{ angle: 90, layerSpacing: 35 })
});
// the template we defined earlier
myDiagram.nodeTemplate =
$(go.Node, "Horizontal",
{ background: "#44CCFF" },
$(go.Picture,
{ margin: 10, width: 50, height: 50, background: "red" },
new go.Binding("source")),
$(go.TextBlock, "Default Text",
{ margin: 12, stroke: "white", font: "bold 16px sans-serif" },
new go.Binding("text", "name"))
);
// define a Link template that routes orthogonally, with no arrowhead
myDiagram.linkTemplate =
$(go.Link,
{ routing: go.Link.Orthogonal, corner: 5 },
$(go.Shape, { strokeWidth: 3, stroke: "#555" })); // the link shape
var model = $(go.TreeModel);
model.nodeDataArray =
[
{ key: "1", name: "Don Meow", source: "cat1.png" },
{ key: "2", parent: "1", name: "Demeter", source: "cat2.png" },
{ key: "3", parent: "1", name: "Copricat", source: "cat3.png" },
{ key: "4", parent: "3", name: "Jellylorum", source: "cat4.png" },
{ key: "5", parent: "3", name: "Alonzo", source: "cat5.png" },
{ key: "6", parent: "2", name: "Munkustrap", source: "cat6.png" }
];
myDiagram.model = model;
</script>
<h2 id="LearnMore">Learn More</h2>
<p>
You may want to read more tutorials, such as the <a href="graphObject.html">GraphObject Manipulation</a> tutorial
and the <a href="interactivity.html">Interactivity</a> tutorial.
You can also watch tutorials on <a href="https://www.youtube.com/channel/UC9We8EoX596-6XFjJDtZIDg">YouTube</a>.
</p>
<p>
Also consider looking at the <a href="../samples/index.html">samples</a> to see some of the diagrams possible with <b>GoJS</b>,
or read the <a href="../intro/index.html">technical introduction</a> to get
an in-depth look at the components of <b>GoJS</b>.
</p>
<p class="footer">
GoJS &reg; by Northwoods Software. Copyright &copy; 1998-2020 <a href="https://www.nwoods.com" target="_blank">Northwoods Software</a> &reg;
</p>
</div> <!-- end container-fluid -->
<div class="banner" id="bannerbottom">
<!-- text in banner-->
</div>
<script src="../assets/js/jquery.min.js"></script>
<script async src="../assets/js/bootstrap.min.js"></script>
</body>
</html>
+592
View File
@@ -0,0 +1,592 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Tutorial for interactivity with GoJS." />
<title>GoJS Interactivity</title>
<!-- Copyright 1998-2020 by Northwoods Software Corporation. -->
<link href="../assets/css/bootstrap.min.css" rel="stylesheet" >
<!-- custom CSS after bootstrap -->
<link href="../assets/css/main.css" rel="stylesheet" type="text/css"/>
<link href="../assets/css/highlight.css" rel="stylesheet" type="text/css" media="all" />
<script src="../assets/js/highlight.js"></script>
<script src="../release/go.js"></script>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-1506307-5', 'auto');
ga('send', 'pageview');
</script>
</head>
<body>
<!-- non-fixed navbar -->
<nav id="non-fixed-nav" class="navbar navbar-inverse navbar-top">
<div class="container-fluid">
<div class="navbar-header">
<div class="navheader-container">
<div class="navheader-collapse" data-toggle="collapse" data-target="#navbar">
<a id="toplogo" class="navbar-brand" href="../index.html">GoJS</a>
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
</div>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right">
<li><a href="../index.html">Home</a></li>
<li><a href="../learn/index.html">Learn</a></li>
<li><a href="../samples/index.html">Samples</a></li>
<li><a href="../intro/index.html">Intro</a></li>
<li><a href="../api/index.html" target="api">API</a></li>
<li><a href="https://www.nwoods.com/components/evalform.htm">Register</a></li>
<li><a href="../download.html">Download</a></li>
<li><a href="https://forum.nwoods.com/c/gojs">Forum</a></li>
<li><a href="https://www.nwoods.com/contact.html" onclick="ga('send','event','Outbound Link','click','contact');">Contact</a></li>
<li class="buy"><a href="https://www.nwoods.com/sales/index.html" onclick="ga('send','event','Outbound Link','click','buy');">Buy</a></li>
<li class="activate"><a href="https://www.nwoods.com/app/activate.aspx?sku=gojs">Activate</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
<div id="bannertop" class="jumbotron banner">
<div class="container-fluid plr15">
<h1><span>GoJS Interactivity</span></h1>
</div>
</div>
<div class="container-fluid learn-container">
<h2 id="BuiltinGoJSInteractivity">Built-in GoJS Interactivity</h2>
<p>
<b>GoJS</b> implements a number of common editing operations, such as manipulating parts
(moving, adding, copying, cutting, and deleting).
These editing abilities are accessible via mouse (or touch) and keyboard by default,
and can also be invoked programmatically in JavaScript.
</p>
<p>
The following Diagram defines a node template and has four nodes in its model:
</p>
<pre class="lang-js">
var $ = go.GraphObject.make;
myDiagram =
$(go.Diagram, "myDiagramDiv",
{ "undoManager.isEnabled": true });
// define a simple Node template
myDiagram.nodeTemplate =
$(go.Node, "Auto",
$(go.Shape, "Rectangle",
// don't draw any outline
{ stroke: null },
// the Shape.fill comes from the Node.data.color property
new go.Binding("fill", "color")),
$(go.TextBlock,
// leave some space around larger-than-normal text
{ margin: 6, font: "18px sans-serif" },
// the TextBlock.text comes from the Node.data.key property
new go.Binding("text", "key"))
);
myDiagram.model = new go.GraphLinksModel(
[
{ key: "Alpha", color: "lightblue" },
{ key: "Beta", color: "orange" },
{ key: "Gamma", color: "lightgreen" },
{ key: "Delta", color: "pink" }
]);
</pre>
<!-- LIVE -->
<div id="myDiagramDiv" class="diagramStyling" style="width:700px; height:150px"></div>
<script>
function setupDiagram(divname) {
var $ = go.GraphObject.make;
var myDiagram =
$(go.Diagram, divname,
{ "undoManager.isEnabled": true });
myDiagram.nodeTemplate =
$(go.Node, "Auto",
$(go.Shape, "Rectangle",
{ stroke: null },
new go.Binding("fill", "color")),
$(go.TextBlock,
{ margin: 6, font: "18px sans-serif" },
new go.Binding("text", "key"))
);
myDiagram.model = new go.GraphLinksModel(
[
{ key: "Alpha", color: "lightblue" },
{ key: "Beta", color: "orange" },
{ key: "Gamma", color: "lightgreen" },
{ key: "Delta", color: "pink" }
]);
return myDiagram;
}
setupDiagram("myDiagramDiv")
</script>
<p>
Out of the box, several interactions are available:
</p>
<ul>
<li>
Click a node to select it.
Press and drag on a node to move it around.
Or press and drag in the diagram background to pan the entire Diagram.
</li>
<li>
Common keyboard shortcuts such as <code>CTRL-C</code>, <code>CTRL-V</code>, <code>CTRL-X</code>
will copy, paste, and cut diagram parts, respectively.
</li>
<li>
Drag-and-hold allows you to create a selection box for selecting multiple nodes.
CTRL-clicking on nodes allows you to toggle their selection.
</li>
<li>
Since the Diagram's undoManager was enabled, <code>CTRL-Z</code> and <code>CTRL-Y</code> will undo and redo operations.
Panning (scrolling) and selection are not considered undoable operations.
</li>
</ul>
<p>
By setting a few properties you can expose more interaction to a user:
</p>
<pre class="lang-js">
var $ = go.GraphObject.make;
var myDiagram =
$(go.Diagram, divname,
{
// allow double-click in background to create a new node
"clickCreatingTool.archetypeNodeData": { key: "Node", color: "white" },
// allow Ctrl-G to group
"commandHandler.archetypeGroupData": { text: "Group", isGroup: true },
// have mouse wheel events zoom in and out instead of scroll up and down
"toolManager.mouseWheelBehavior": go.ToolManager.WheelZoom,
"undoManager.isEnabled": true // enable undo &amp; redo
});
myDiagram.nodeTemplate =
$(go.Node, "Auto",
$(go.Shape, "Rectangle",
{ stroke: null },
new go.Binding("fill", "color")),
$(go.TextBlock,
{ margin: 6, font: "18px sans-serif", editable: true },
new go.Binding("text", "key"))
);
// allow CTRL-SHIFT-G to ungroup a selected Group
myDiagram.groupTemplate.ungroupable = true;
myDiagram.model = new go.GraphLinksModel(
[
{ key: "Alpha", color: "lightblue" },
{ key: "Beta", color: "orange" },
{ key: "Gamma", color: "lightgreen", group: "Group1" },
{ key: "Delta", color: "pink", group: "Group1" },
{ key: "Group1", isGroup: true }
]);
</pre>
<!-- LIVE -->
<div id="myDiagramDiv2" class="diagramStyling" style="width:700px; height:150px"></div>
<script>
function setupDiagram(divname) {
var $ = go.GraphObject.make;
var myDiagram =
$(go.Diagram, divname,
{
// allow double-click in background to create a new node
"clickCreatingTool.archetypeNodeData": { key: "Node", color: "white" },
// allow Ctrl-G to group
"commandHandler.archetypeGroupData": { text: "Group", isGroup: true },
// have mouse wheel events zoom in and out instead of scroll up and down
"toolManager.mouseWheelBehavior": go.ToolManager.WheelZoom,
"undoManager.isEnabled": true // enable undo & redo
});
myDiagram.nodeTemplate =
$(go.Node, "Auto",
$(go.Shape, "Rectangle",
{ stroke: null },
new go.Binding("fill", "color")),
$(go.TextBlock,
{ margin: 6, font: "18px sans-serif", editable: true },
new go.Binding("text", "key"))
);
// allow CTRL-SHIFT-G to ungroup a selected Group
myDiagram.groupTemplate.ungroupable = true;
myDiagram.model = new go.GraphLinksModel(
[
{ key: "Alpha", color: "lightblue" },
{ key: "Beta", color: "orange" },
{ key: "Gamma", color: "lightgreen", group: "Group1" },
{ key: "Delta", color: "pink", group: "Group1" },
{ key: "Group1", isGroup: true }
]);
return myDiagram;
}
setupDiagram("myDiagramDiv2")
</script>
<p>
<ul>
<li>
<code>ClickCreatingTool.archetypeNodeData</code> allows a double-click in the background to create
a new node with the specified data.
</li>
<li>
<code>CommandHandler.archetypeGroupData</code> allows <code>CTRL-G</code> to group a selection of nodes.
</li>
<li>
<code>Group.ungroupable</code> allows <code>CTRL-SHIFT-G</code> to ungroup a selected group.
</li>
<li>
<code>ToolManager.mouseWheelBehavior</code> allows the mouse wheel to zoom instead of scroll by default.
You can toggle this property by clicking on the mouse-wheel.
On touch devices, pinch-zooming is enabled by default.
</li>
<li>
<code>TextBlock.editable</code> in the <code>TextBlock</code> definition allows the text to be edited in place.
Select a node and then click on the text, or press F2, to begin text editing.
Click anywhere else on the diagram or press <code>Tab</code> to finish editing text.
</li>
</ul>
</p>
<p>
These interactions (and more!) are all present in the <a href="../samples/basic.html">basic.html sample</a>.
Be sure to also see the <a href="../intro/commands.html">Intro page on GoJS commands</a>.
</p>
<p>
You can disable portions of Diagram interactivity with several properties,
depending on what you want to allow users to do.
See the <a href="../intro/permissions.html">Intro page on GoJS permissions</a> for more.
</p>
<h2 id="ContextMenus">Context Menus</h2>
<p>
<b>GoJS</b> provides a mechanism for you to define context menus for any object or for the Diagram itself.
In the example below, two context menus are defined, one on the Node template (with one button) and
one on the Diagram (with two buttons).
</p>
<pre class="lang-js">
var $ = go.GraphObject.make;
var myDiagram =
$(go.Diagram, divname,
{ "undoManager.isEnabled": true });
// this function is called when the context menu button is clicked
function nodeClicked(e, obj) {
alert('node ' + obj.part.data.key + ' was clicked');
}
// defines a context menu to be referenced in the node template
var contextMenuTemplate =
$(go.Adornment, "Vertical",
$("ContextMenuButton",
$(go.TextBlock, "Click me!"),
{ click: nodeClicked })
// more ContextMenuButtons would go here
);
myDiagram.nodeTemplate =
$(go.Node, "Auto",
{ contextMenu: contextMenuTemplate }, // set the context menu
$(go.Shape, "Rectangle",
{ stroke: null },
new go.Binding("fill", "color")),
$(go.TextBlock,
{ margin: 6, font: "18px sans-serif" },
new go.Binding("text", "key"))
);
// this function alerts the current number of nodes in the Diagram
function countNodes(e, obj) {
alert('there are ' + e.diagram.nodes.count + ' nodes');
}
// this function creates a new node and inserts it at the last event's point
function addNode(e, obj) {
var data = { key: "Node", color: "white" };
e.diagram.model.addNodeData(data);
var node = e.diagram.findPartForData(data);
node.location = e.diagram.lastInput.documentPoint;
}
myDiagram.contextMenu =
$(go.Adornment, "Vertical",
$("ContextMenuButton",
$(go.TextBlock, "Count Nodes"),
{ click: countNodes }),
$("ContextMenuButton",
$(go.TextBlock, "Add Node"),
{ click: addNode })
// more ContextMenuButtons would go here
);
myDiagram.model = new go.GraphLinksModel(
[
{ key: "Alpha", color: "lightblue" },
{ key: "Beta", color: "orange" }
]);
return myDiagram;
</pre>
<!-- LIVE -->
<div id="myDiagramDiv3" class="diagramStyling" style="width:700px; height:150px"></div>
<script>
function setupDiagram(divname) {
var $ = go.GraphObject.make;
var myDiagram =
$(go.Diagram, divname,
{ "undoManager.isEnabled": true });
// this function is called when the context menu button is clicked
function nodeClicked(e, obj) {
alert('node ' + obj.part.data.key + ' was clicked');
}
// defines a context menu to be referenced in the node template
var contextMenuTemplate =
$(go.Adornment, "Vertical",
$("ContextMenuButton",
$(go.TextBlock, "Click me!"),
{ click: nodeClicked })
// more ContextMenuButtons would go here
);
myDiagram.nodeTemplate =
$(go.Node, "Auto",
{ contextMenu: contextMenuTemplate }, // set the context menu
$(go.Shape, "Rectangle",
{ stroke: null },
new go.Binding("fill", "color")),
$(go.TextBlock,
{ margin: 6, font: "18px sans-serif" },
new go.Binding("text", "key"))
);
// this function alerts the current number of nodes in the Diagram
function countNodes(e, obj) {
alert('there are ' + e.diagram.nodes.count + ' nodes');
}
// this function creates a new node and inserts it at the last event's point
function addNode(e, obj) {
var data = { key: "Node", color: "white" };
e.diagram.model.addNodeData(data);
var node = e.diagram.findPartForData(data);
node.location = e.diagram.lastInput.documentPoint;
}
myDiagram.contextMenu =
$(go.Adornment, "Vertical",
$("ContextMenuButton",
$(go.TextBlock, "Count Nodes"),
{ click: countNodes }),
$("ContextMenuButton",
$(go.TextBlock, "Add Node"),
{ click: addNode })
// more ContextMenuButtons would go here
);
myDiagram.model = new go.GraphLinksModel(
[
{ key: "Alpha", color: "lightblue" },
{ key: "Beta", color: "orange" }
]);
return myDiagram;
}
setupDiagram("myDiagramDiv3")
</script>
<p>
If you right-click (or long-tap on a touch device) on a Node or the Diagram, you will see the <b>GoJS</b> context menu
appear with the defined options.
</p>
<p>
The <a href="../samples/basic.html">basic.html sample</a> contains more complex context menu examples.
See the <a href="../intro/contextmenus.html">Intro page on GoJS context menus</a> for more.
</p>
<h2 id="LinkInteractions">Link interactions</h2>
<p>
<b>GoJS</b> lets users draw new links and re-link existing links by dragging out from a port or
selecting a link and dragging its handles.
To enable these tools, some properties need to be set:
</p>
<pre class="lang-js">
myDiagram.nodeTemplate =
$(go.Node, "Auto",
$(go.Shape, "Rectangle",
{
stroke: null,
portId: "",
cursor: "pointer",
fromLinkable: true, fromLinkableSelfNode: true, fromLinkableDuplicates: true,
toLinkable: true, toLinkableSelfNode: true, toLinkableDuplicates: true
},
new go.Binding("fill", "color")),
$(go.TextBlock,
{ margin: 6, font: "18px sans-serif" },
new go.Binding("text", "key"))
);
myDiagram.linkTemplate =
$(go.Link,
{
// allow the user to relink existing links:
relinkableFrom: true, relinkableTo: true,
// draw the link path shorter than normal,
// so that it does not interfere with the appearance of the arrowhead
toShortLength: 2
},
$(go.Shape,
{ strokeWidth: 2 }),
$(go.Shape,
{ toArrow: "Standard", stroke: null })
);
myDiagram.model = new go.GraphLinksModel(
[
{ key: "Alpha", color: "lightblue" },
{ key: "Beta", color: "orange" },
{ key: "Gamma", color: "lightgreen" },
{ key: "Delta", color: "pink" }
],
[
{ from: 'Alpha', to: 'Beta' },
{ from: 'Alpha', to: 'Delta' },
]
);
</pre>
<!-- LIVE -->
<div id="myDiagramDiv4" class="diagramStyling" style="width:700px; height:150px"></div>
<script>
function setupDiagram(divname) {
var $ = go.GraphObject.make;
var myDiagram =
$(go.Diagram, divname,
{ "undoManager.isEnabled": true });
myDiagram.nodeTemplate =
$(go.Node, "Auto",
$(go.Shape, "Rectangle",
{
stroke: null,
portId: "",
cursor: "pointer",
fromLinkable: true, fromLinkableSelfNode: true, fromLinkableDuplicates: true,
toLinkable: true, toLinkableSelfNode: true, toLinkableDuplicates: true
},
new go.Binding("fill", "color")),
$(go.TextBlock,
{ margin: 10, font: "18px sans-serif" },
new go.Binding("text", "key"))
);
myDiagram.linkTemplate =
$(go.Link,
{
// allow the user to relink existing links:
relinkableFrom: true, relinkableTo: true,
// draw the link path shorter than normal,
// so that it does not interfere with the appearance of the arrowhead
toShortLength: 2
},
$(go.Shape,
{ strokeWidth: 2 }),
$(go.Shape,
{ toArrow: "Standard", stroke: null })
);
myDiagram.model = new go.GraphLinksModel(
[
{ key: "Alpha", color: "lightblue" },
{ key: "Beta", color: "orange" },
{ key: "Gamma", color: "lightgreen" },
{ key: "Delta", color: "pink" }
],
[
{ from: 'Alpha', to: 'Beta' },
{ from: 'Alpha', to: 'Delta' },
]);
return myDiagram;
}
setupDiagram("myDiagramDiv4")
</script>
<p>
In the above example:
</p>
<ul>
<li>
The <code>Shape</code> has its <code>portId</code> set to make it the port instead of the entire node.
Then several <code>...linkable</code> properties are set, allowing each node to link to itself and others.
</li>
<li>
To create a new link to another node, drag from the port (the edge of the Shape that is not
behind the TextBlock) to any node, including itself.
</li>
<li>
In the link template, <code>relinkable...</code> properties are set, so that when the link is selected,
it shows handles that can be dragged in order to reconnect the link with a different node.
</li>
</ul>
<p>
<b>GoJS</b> allows linking and re-linking to abide by custom criteria in which source and destination nodes are valid.
You can read about this in the <a href="../intro/validation.html">Intro page on Validation</a>.
</p>
<p>
<b>GoJS</b> links have many interesting properties that are covered in depth in the
<a href="../intro/links.html">Intro page on Links</a> and on the following pages.
</p>
<p>
You may want to read more tutorials, such as the <a href="index.html">Learn GoJS</a> tutorial
and the <a href="graphObject.html">GraphObject Manipulation</a> tutorial
You can also watch tutorials on <a href="https://www.youtube.com/channel/UC9We8EoX596-6XFjJDtZIDg">YouTube</a>.
</p>
<p class="footer">
GoJS &reg; by Northwoods Software. Copyright &copy; 1998-2020 <a href="https://www.nwoods.com" target="_blank">Northwoods Software</a> &reg;
</p>
</div> <!-- end main -->
<div class="banner" id="bannerbottom">
<!-- text in banner-->
</div>
<script src="../assets/js/jquery.min.js"></script>
<script async src="../assets/js/bootstrap.min.js"></script>
</body>
</html>
File diff suppressed because it is too large Load Diff
+190
View File
@@ -0,0 +1,190 @@
# KodExplorer
> ## Update to kodbox: [https://github.com/kalcaddle/kodbox](https://github.com/kalcaddle/kodbox)
> [Download](https://kodcloud.com/download/) | [Demo](https://demo.kodcloud.com/)
> *It is recommended to use a new design upgrade product:kodbox*
> *该项目处于维护阶段,不再开发新功能.推荐使用全新设计升级产品kodbox*
----
[![Home page](https://img.shields.io/badge/home-page-yellow.svg?style=flat)](http://kodcloud.com) [![GPLV3 License](https://img.shields.io/badge/Licence-GPLV3-green.svg?style=flat)](http://kodcloud.com) [![Download](https://img.shields.io/badge/download-~953.3K-red.svg?style=flat)](https://github.com/kalcaddle/KODExplorer/archive/master.zip)
> KodExplorer is a file manager for web. It is also a web code editor, which allows you to develop websites directly within the web browser.You can run KodExplorer either online or locally,on Linux, Windows or Mac based platforms. The only requirement is to have PHP 5 available.
![](https://raw.githubusercontent.com/kalcaddle/static/master/images/kod/common2.png)
![](https://raw.githubusercontent.com/kalcaddle/static/master/images/kod/common3.png)
### [Demo](http://demo.kodcloud.com/) [user: demo/demo]
-----
- [Change log](./ChangeLog.md)
- [Document/开发文档](http://doc.kodcloud.com/)
- [Donate](https://www.paypal.me/kalcaddle)
### Source code
----
- [github](https://github.com/kalcaddle/KodExplorer)
- [gitee](https://gitee.com/kalcaddle/KODExplorer)
# Features
- Use experience like operating system, Rich context menu and toolbar, drag and drop, shortcut keys......
- Available in more than 40 languages.
- File Manage
- All operations with files and folders on a remote server(copy,cut,paste,move,remove,upload,create folder/file,rename,etc.)
- Multi-User support,custom role group.
- Flexible configuration of access rights,file types restriction, user - interface and other
- Clipboard: copy, cut, paste, clear
- Selectable files & folders support (mouse click & Ctrl & Shift & words & Keyboard shortcuts)
- Keyboard shortcuts: delete deletion, ctrl+A select, ctrl+C replication, ctrl+X splicing, up/down/left/right/home/end etc.
- Multiple actions support for selected files & folders: move,copy,cute,remove,rename,open,archive,delete,download etc.
- Double or single click setup to open files & folders
- Filetree: allow to open and display multiple subfolders at a time
- Implemented natural sorting on the client-side
- List,Icons and Split view;
- Move/Copy/Clone/Delete files with Drag & Drop
- Share files or folder to others.
- Add folder to your favorites
- Calculate directory sizes
- Thumbnails for image files
- Normalizer:UTF-8 Normalizer of file-name and file-path etc.
- Muti Charset support, in a variety of circumstances garbled solution;Sanitizer of file-name and file-path etc.
- Multiple & chunked uploads support,
- Background file upload with Drag & Drop HTML5 support;Folder upload with Chrome, Firefox and Edge
- Upload form URL (or list)
- Direct extraction to the current working directory (you do not want - to create a folder)
- Search: search by filename & file contents
- File exclusion based on name
- Copy direct file URL
- Archives create/extract/preview (zip, rar, 7z, tar, gzip, tgz)
- Quicklook, preview for common file types; image file,text file,pdf,swf,document file etc.
- Video and audio player relying on web browser capabilities
- Editor
- Syntax highlighting for over 120 languages
- Multiple label, Drag & Drop the label.
- Over 15 themes,Choose your favorite programming style
- Web development: HTML/JS/CSS editor with Emmet integrated
- Automatic indent and outdent;Line wrapping;Code folding
- Multiple cursors and selections;(Middle key select;Ctrl+Command+G)
- Autocomplete.
- Fully customizable key bindings including vim and Emacs modes
- Search and replace with regular expressions;Highlight matching parentheses
- Toggle between soft tabs and real tabs
- Displays hidden characters
- Drag and drop text using the mouse
- Live syntax checker (JavaScript/CoffeeScript/CSS/XQuery/HTML/PHP etc.)
- Cut, copy, and paste functionality
- Markdown support.(live preview;convert to html etc.)
- Format: JavaScript/CSS/HTML/JSON/PHP etc.
- Cross-platform, even on mobile devices
- Easy to integrate with other systems
- Developed by kod itself, this is a nice try.
# Install
**1. Install from source**
```
git clone https://github.com/kalcaddle/KODExplorer.git
chmod -Rf 777 ./KODExplorer/*
```
**2. Install via download**
```
wget https://github.com/kalcaddle/KODExplorer/archive/master.zip
unzip master.zip
chmod -Rf 777 ./*
```
# FAQs
* Forget password
> Login page: see the "Forget password".
* Upload with Drag & Drop
> Browser compatibility: Chrome, Firefox and Edge
* How to make the system more secure?
> Make sure the administrator password is more complex.
> Open login verification code.
> Set the http server to not allow list the directory;
> PHP Security:Set the path for open_basedir.
# Screenshot
### file manage:
- Overview
![Overview](https://raw.githubusercontent.com/kalcaddle/static/master/images/kod/file.png)
- File list Type (icon,list,split)
![File list Type](https://raw.githubusercontent.com/kalcaddle/static/master/images/kod/file-resize.png)
- Archives create/extract/preview (zip, rar, 7z, tar, gzip, tgz)
![Archives create/extract/preview](https://raw.githubusercontent.com/kalcaddle/static/master/images/kod/file-unzip.png)
- Drag upload
![Drag upload](https://raw.githubusercontent.com/kalcaddle/static/master/images/kod/file-upload-drag.png)
- Player
![Player](https://raw.githubusercontent.com/kalcaddle/static/master/images/kod/file-player.png)
- Online Office view & Editor
![Online Office](https://raw.githubusercontent.com/kalcaddle/static/master/images/kod/file-open-pptx.png)
### Editor:
- Overview
![Overview](https://raw.githubusercontent.com/kalcaddle/static/master/images/kod/editor.png)
- Live preview
![Live preview](https://raw.githubusercontent.com/kalcaddle/static/master/images/kod/editor-preview.png)
- Search folder
![Search folder](https://raw.githubusercontent.com/kalcaddle/static/master/images/kod/editor-search.png)
- Markdown
![Markdown](https://raw.githubusercontent.com/kalcaddle/static/master/images/kod/file-markdown.png)
- Code style
![Code style](https://raw.githubusercontent.com/kalcaddle/static/master/images/kod/editor-theme.png)
### Others:
- System role
![System role](https://raw.githubusercontent.com/kalcaddle/static/master/images/kod/system-role.png)
- Colorful Theme
![Colorful Theme](https://raw.githubusercontent.com/kalcaddle/static/master/images/kod/system-theme.png)
- Custom Theme
![Custom Theme](https://raw.githubusercontent.com/kalcaddle/static/master/images/kod/common-alpha.png)
- Language
![Language](https://raw.githubusercontent.com/kalcaddle/static/master/images/kod/language.png)
# Software requirements
- Server:
- Windows,Linux,Mac ...
- PHP 5.0+
- Database: File system driver;sqlite;mysql;...
- Browser compatibility:
- Chrome
- Firefox
- Opera
- IE8+
> Tips: It can also run on a router, or your home NAS
# Credits
kod is made possible by the following open source projects.
* [seajs](https://github.com/seajs/seajs)
* [jQuery](https://github.com/jquery/jquery)
* [ace](https://github.com/ajaxorg/ace)
* [zTree](https://github.com/zTree/zTree_v3)
* [webuploader](https://github.com/fex-team/webuploader)
* [artTemplate](http://aui.github.com/artTemplate/)
* [artDialog](https://github.com/aui/artDialog)
* [jQuery-contextMenu](http://medialize.github.com/jQuery-contextMenu/)
* ...
# License
kodcloud is issued under GPLv3. license.[License](http://kodcloud.com/tools/licenses/license.txt)
Contact: warlee#kodcloud.com
Copyright (C) 2013 kodcloud.com
# 版权声明
kodexplorer 使用 GPL v3 协议.
+109
View File
@@ -0,0 +1,109 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
if(!function_exists('get_client_ip')){
require_once(dirname(dirname(__FILE__)).'/function/web.function.php');
}
class SSO{
static private function init(){
$sessionName = 'KOD_SESSION_SSO';
$sessionID = $_COOKIE[$sessionName]?$_COOKIE[$sessionName]:md5(uniqid());
$basicPath = dirname(dirname(dirname(__FILE__))).'/';
$sessionPath = $basicPath.'data/session/';
if(file_exists($basicPath.'config/define.php')){
include($basicPath.'config/define.php');
$sessionPath = DATA_PATH.'session/';
}
if(!file_exists($sessionPath)){
mkdir($sessionPath);
}
$sessionSavePath = @session_save_path();
@session_write_close();
@session_name($sessionName);
if( class_exists('SaeStorage') ||
defined('SAE_APPNAME') ||
defined('SESSION_PATH_DEFAULT') ||
@ini_get('session.save_handler') != 'files' ||
isset($_SERVER['HTTP_APPNAME']) ){
//sae 关闭自定义session路径
}else{
@session_save_path($sessionPath);//session path
}
@session_id($sessionID);
@session_start();
$_SESSION['kodSSO'] = true;
@session_write_close();
unset($_SESSION);
@session_start();
if(!isset($_SESSION['kodSSO']) || !$_SESSION['kodSSO']){
@session_save_path($sessionSavePath);//session path
@session_start();
$_SESSION['kodSSO'] = true;
@session_write_close();
}
//echo '<pre>';var_dump($_SESSION);echo '</pre>';exit;
return $_SESSION;
}
/**
* 设置session 认证
* @param [type] $key [认证key]
*/
static public function sessionSet($key,$value='success'){
self::init();
@session_start();
$_SESSION[$key] = $value;
@session_write_close();
}
static public function sessionCheck($key,$value='success'){
$session = self::init();
if( isset($session[$key]) && $session[$key] == $value){
return true;
}
return false;
}
/**
* 直接调用kod的登陆检测(适用于同服务器同域名;)
* @param [type] $kodHost kod的地址;例如 http://test.com/ ;默认为插件目录
* @param [type] $appKey 应用标记 例如 loginCheck
* @param [type] $appUrl 验证后跳转到的url;默认为当前url
* @param [type] $auth 验证方式:例如:'check=userName&value=smartx'
* check (userID|userName|roleID|roleName|groupID|groupName) 校验方式,为空则所有登陆用户
*/
static public function sessionAuth($appKey,$auth,$kodHost='',$appUrl=''){
if($kodHost==''){
$appUrl = this_url();
if(strstr($appUrl,'/plugins/')){
$kodHost = substr($appUrl,0,strpos($appUrl,'/plugins/'));
}else{
if(isset($_COOKIE['APP_HOST'])){
$kodHost = $_COOKIE['APP_HOST'];
}else{
$kodHost = $_SERVER['HTTP_REFERER'];
if(strstr($kodHost,'/index.php?')){
$kodHost = substr($kodHost,0,strpos($kodHost,'/index.php?'));
}else if(strstr($kodHost,'/?')){
$kodHost = substr($kodHost,0,strpos($kodHost,'/?'));
}
}
}
}
$authUrl = rtrim($kodHost,'/').'/index.php?user/sso&app='.$appKey.'&'.$auth;
if($appUrl == ''){
$appUrl = this_url();
}
if(!self::sessionCheck($appKey)){
session_destroy();
header('Location: '.$authUrl.'&link='.rawurlencode($appUrl));
exit;
}
}
}
+53
View File
@@ -0,0 +1,53 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
class api extends Controller{
function __construct(){
parent::__construct();
}
/**
* 通用文件预览方案
* image,media,cad,office,webodf,pdf,epub,swf,text
* 跨域:epub,pdf,odf,[text];
* @return [type] [description]
*/
public function view(){
if(!isset($this->in['path'])){
show_tips('参数错误!');
}
$this->checkAccessToken();
$this->setIdentify();
$this->display('view.html');
}
private function setIdentify(){
if(! $_SESSION['accessPlugin'] ){
session_start();
$_SESSION['accessPlugin'] = 'ok';
session_write_close();
}
}
public function checkAccessToken(){
$model = $this->loadModel('Plugin');
$config = $model->getConfig('fileView');
if(!$config['apiKey']){
return;
}
$timeTo = isset($this->in['timeTo'])?intval($this->in['timeTo']):'';
$token = md5($config['apiKey'].$this->in['path'].$timeTo);
//show_tips(array($config['apiKey'],$token,$this->in));
if($token != $this->in['token']){
show_tips('token 错误!');
}
if($timeTo != '' && $timeTo <= time()){
show_tips('token已失效!');
}
}
}
+141
View File
@@ -0,0 +1,141 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
class app extends Controller{
function __construct() {
parent::__construct();
$this->sql=new FileCache(USER_SYSTEM.'apps.php');
}
/**
* 用户首页展示
*/
public function index() {
$this->display('index.html');
}
public function initApp(){
//为空则不初始化桌面
if(!$this->config['settingSystem']['desktopFolder']){
return;
}
$list = $this->sql->get();
$newUserApp = $this->config['settingSystem']['newUserApp'];
$default = explode(',',$newUserApp);
$info = array();
foreach ($default as $key) {
$info[$key] = $list[$key];
}
$desktop = iconv_system(HOME.DESKTOP_FOLDER.'/');
if($GLOBALS['isRoot'] == 1){
$desktop = iconv_system(MYHOME.DESKTOP_FOLDER.'/');
}
mk_dir($desktop);
if(!path_writeable($desktop)){
return;
}
foreach ($info as $key => $data) {
if (!is_array($data)) {
continue;
}
$path = $desktop.iconv_system($key).'.oexe';
unset($data['name']);
unset($data['desc']);
unset($data['group']);
file_put_contents($path, json_encode($data));
}
}
/**
* 用户app 添加、编辑
*/
public function userApp() {
$path = _DIR($this->in['path']);
if(get_path_ext($path) != 'oexe'){
$path .= '.oexe';
}
if (!checkExt($path)) {
show_json(LNG('error'));exit;
}
$data = $this->_init();
unset($data['name']);
unset($data['path']);
unset($data['desc']);
unset($data['group']);
$res = file_put_contents($path, json_encode($data));
show_json(LNG('success'));
}
/**
* 获取列表
*/
public function get() {
$list = array();
if (!isset($this->in['group']) || $this->in['group']=='all') {
$list = $this->sql->get();
}else{
$list = $this->sql->get(array('group',$this->in['group']));
}
$list = array_reverse($list);
show_json($list);
}
/**
* 添加
*/
public function add() {
$res=$this->sql->set(rawurldecode($this->in['name']),$this->_init());
if($res) show_json(LNG('success'));
show_json(LNG('error_repeat'),false);
}
/**
* 编辑
*/
public function edit() {
//查找到一条记录,修改为该数组
$this->sql->remove(rawurldecode($this->in['old_name']));
if($this->sql->set(rawurldecode($this->in['name']),$this->_init())){
show_json(LNG('success'));
}
show_json(LNG('error_repeat'),false);
}
/**
* 删除
*/
public function del() {
if($this->sql->remove(rawurldecode($this->in['name']))){
show_json(LNG('success'));
}
show_json(LNG('error'),false);
}
public function getUrlTitle(){
$html = curl_get_contents($this->in['url']);
$result = match_text($html,"<title>(.*)<\/title>");
if (strlen($result)>50) {
$result = mb_substr($result,0,50,'utf-8');
}
if (!$result || strlen($result) == 0) {
$result = $this->in['url'];
$result = str_replace(array('http://','&','/'),array('','@','-'), $result);
}
show_json($result);
}
private function _init(){
$data = rawurldecode($this->in['data']);
$arr = json_decode($data,true);
if(!is_array($arr)){
show_json(LNG('error'),false);
}
return $arr;
}
}
@@ -0,0 +1,32 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
class desktop extends Controller{
function __construct() {
parent::__construct();
}
public function index() {
$wap = is_wap() && (!isset($_COOKIE['forceWap']) || $_COOKIE['forceWap'] == '1');
$desktopApps = include(DATA_PATH.'system/desktop_app.php');
$wall = $this->config['user']['wall'];
if( !strstr($wall,'/') ){
$wall = STATIC_PATH.'images/wall_page/'.$wall.'.jpg';
}
$wall = str_replace('&amp;','&',$wall);
$desktop = iconv_system(HOME.DESKTOP_FOLDER.'/');
if($GLOBALS['isRoot'] == 1){
$desktop = iconv_system(MYHOME.DESKTOP_FOLDER.'/');
}
mk_dir($desktop);
$this->assign('wall',$wall);
$this->assign('desktopApps',$desktopApps);
$this->display('index.html');
}
}
@@ -0,0 +1,152 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
class editor extends Controller{
function __construct() {
parent::__construct();
}
// 多文件编辑器
public function index(){
$this->themeSet();
$this->display('editor.html');
}
// 单文件编辑
public function edit(){
$this->themeSet();
$this->display('edit.html');
}
private function themeSet(){
$setClass = '';
//获取编辑器配置数据
$editorConfig = $this->config['editorDefault'];
$configFile = USER.'data/editor_config.php';
if (!file_exists(iconv_system($configFile))) {//不存在则创建
$sql=FileCache::save($configFile,$editorConfig);
}else{
$editorConfig=FileCache::load($configFile);
}
$blackTheme = array("ambiance","idle_fingers","monokai","pastel_on_dark","twilight",
"solarized_dark","tomorrow_night_blue","tomorrow_night_eighties");
if(in_array($editorConfig['theme'],$blackTheme)){
$setClass = 'class="code-theme-black"';
}
$this->assign('editorConfig',json_encode($editorConfig));//获取编辑器配置信息
$this->assign('codeThemeBlack',$setClass);//获取编辑器配置信息
}
// 获取文件数据
public function fileGet(){
if(isset($this->in['fileUrl'])){
$pass = $this->config['settingSystem']['systemPassword'];
$fileUrl = $this->in['fileUrl'];
if(!request_url_safe($fileUrl)){
show_json(LNG('url error!'),false);
}
$urlInfo = parse_url_query($fileUrl);
if( isset($urlInfo['fid']) &&
strlen(Mcrypt::decode($urlInfo['fid'],$pass)) != 0
){
$filepath = Mcrypt::decode($urlInfo['fid'],$pass);
$displayName = get_path_this($filepath);
if(isset($urlInfo['downFilename'])){
$displayName = rawurldecode($urlInfo['downFilename']);
}
}else{
$displayName = rawurldecode($urlInfo['name']);
$filepath = $fileUrl.'&accessToken='.access_token_get();
}
}else{
$displayName = rawurldecode($this->in['filename']);
$filepath =_DIR($this->in['filename']);
if (!file_exists($filepath)){
show_json(LNG('not_exists'),false);
}
if (!path_readable($filepath)){
show_json(LNG('no_permission_read_all'),false);
}
if (filesize($filepath) >= 1024*1024*20){
show_json(LNG('edit_too_big'),false);
}
}
$fileContents=file_get_contents($filepath);//文件内容
//echo $fileContents;exit;
if(isset($this->in['charset']) && $this->in['charset']){
$charset = strtolower($this->in['charset']);
}else{
$charset = get_charset($fileContents);
}
if ($charset !='' &&
$charset !='utf-8' &&
function_exists("mb_convert_encoding")
){
$fileContents = @mb_convert_encoding($fileContents,'utf-8',$charset);
}
$data = array(
'ext' => get_path_ext($displayName),
'name' => iconv_app(get_path_this($displayName)),
'filename' => $displayName,
'charset' => $charset,
'base64' => true,// 部分防火墙编辑文件误判问题处理
'content' => base64_encode($fileContents)
);
show_json($data);
}
public function fileSave(){
$fileStr = rawurldecode($this->in['filestr']);
$path =_DIR($this->in['path']);
if(isset($this->in['create_file']) && !file_exists($path)){//不存在则创建
if(!@touch($path)){
show_json(LNG('create_error'),false);
}
}
if (!path_writeable($path)) show_json(LNG('no_permission_write_file'),false);
//支持二进制文件读写操作(base64方式)
if(isset($this->in['base64'])){
$fileStr = base64_decode($fileStr);
}
$charset = strtolower($this->in['charset']);
if(isset($this->in['charsetSave'])){
$charset = strtolower($this->in['charsetSave']);
}
if ( $charset !='' &&
$charset != 'utf-8' &&
$charset != 'ascii' &&
function_exists("mb_convert_encoding")
) {
$fileStr = @mb_convert_encoding($fileStr,$charset,'utf-8');
}
$fp=fopen($path,'wb');
fwrite($fp,$fileStr);
fclose($fp);
show_json(LNG('save_success'));
}
/*
* 获取编辑器配置信息
*/
public function setConfig(){
$file = USER.'data/editor_config.php';
if (!path_writeable(iconv_system($file))) {//配置不可写
show_json(LNG('no_permission_write_file'),false);
}
$key= $this->in['k'];
$value = $this->in['v'];
if ($key !='' && $value != '') {
$sql=new FileCache($file);
$sql->set($key,$value);//没有则添加一条
show_json(LNG('setting_success'));
}else{
show_json(LNG('error'),false);
}
}
}
File diff suppressed because it is too large Load Diff
+82
View File
@@ -0,0 +1,82 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
class fav extends Controller{
private $sql;
function __construct(){
parent::__construct();
$this->sql=new FileCache(USER.'data/fav.php');
}
/**
* 获取收藏夹json
*/
public function get() {
show_json($this->sql->get());
}
/**
* 添加
*/
public function add() {
$name = $this->in['name'];
$path = $this->in['path'];
if($this->sql->get($name)){//已存在则自动重命名
$index = 0;
while ($this->sql->get($name.'('.$index.')')) {
$index ++;
}
$name = $name.'('.$index.')';
}
$res=$this->sql->set(
$name,
array(
'name' => $name,
'path' => $path,
'ext' => $this->in['ext'],
'type' => $this->in['type']
)
);
show_json(LNG('success'));
}
/**
* 编辑
*/
public function edit() {
$this->in['name'] = $this->in['name'];
$this->in['path'] = $this->in['path'];
$this->in['nameTo'] = $this->in['nameTo'];
$newFav = $this->sql->get($this->in['name']);
if(!isset($newFav['type'])){
$newFav['type'] = 'folder';
}
//查找到一条记录,修改为该数组
$toArray=array(
'name'=>$this->in['nameTo'],
'path'=>$this->in['pathTo'],
'type'=>$newFav['type']
);
$this->sql->remove($this->in['name']);
if($this->sql->set($this->in['nameTo'],$toArray)){
show_json(LNG('success'));
}
show_json(LNG('error_repeat'),false);
}
/**
* 删除
*/
public function del() {
$this->in['name'] = $this->in['name'];
if($this->sql->remove($this->in['name'])){
show_json(LNG('success'));
}
show_json(LNG('error'),false);
}
}
@@ -0,0 +1,223 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*
*
* 插件管理:页面;列表;
*/
class pluginApp extends Controller{
function __construct() {
parent::__construct();
}
//?pluginApp/to/epubReader/index&a=1
//?pluginApp/to/epubReader/&a=1 ==>ignore index;
public function to() {
$route = $this->in['URLremote'];
if(count($route) >= 3){
$app = clear_html($route[2]);
$action = $route[3];
if(count($route) == 3){
$action = 'index';
}
$model = $this->loadModel('Plugin');
if(!$model->checkAuth($app)){
if(!$_SESSION['kodLogin']){
show_tips("出错了!您尚未登录",APP_HOST,3);
}
show_tips("出错了!插件未开启,或您没有{$app}插件的权限!");
}
$appConfig = $model->getConfig($app);
if(!$appConfig['pluginAuthOpen'] && !$this->checkAccessPlugin()){
if(!$_SESSION['kodLogin']){
show_tips("出错了!您尚未登录",APP_HOST,3);
}
show_tips("出错了!插件未开启,或您没有{$app}插件的权限");
}
Hook::trigger("pluginRun.before",$app.'Plugin.'.$action);
Hook::trigger($app.'Plugin.'.$action.'.before');
Hook::apply($app.'Plugin.'.$action);
Hook::trigger($app.'Plugin.'.$action.'.after');
Hook::trigger("pluginRun.after",$app.'Plugin.'.$action);
}
}
//权限认证
private function checkAccessPlugin(){
if( $_SESSION['kodLogin'] == true ||
$_SESSION['accessPlugin'] == 'ok' ||
$this->checkAccessShare()
){
return true;
}
return false;
}
private function checkAccessShare(){
if(!isset($this->in['path'])){
return false;
}
$share = KOD_USER_SHARE;
if(substr(urldecode($this->in['path']),0,strlen($share)) == $share){
return true;
}
return false;
}
//plugin manager
public function index() {
$this->display('index.html');
}
public function appList(){
$model = $this->loadModel('Plugin');
$list = $model->viewList();
show_json($list);
}
public function changeStatus(){
if( !isset($this->in['app']) ||
!isset($this->in['status'])){
show_json(LNG('data_not_full'),false);
}
$app = $this->in['app'];
$status = $this->in['status']?1:0;
$model = $this->loadModel('Plugin');
//启用插件则检测配置文件,必填字段是否为空;为空则调用配置
if($status){
$config = $model->getConfig($app);
$package = $model->getPackageJson($app);
$needConfig = false;
foreach($package['configItem'] as $key=>$item) {
if( (isset($item['require']) && $item['require']) &&
(!isset($item['value']) || $item['value'] === '' || $item['value'] === null) &&
(!isset($config[$key]) || $config[$key] == "")
){
$needConfig = true;
break;
}
}
if($needConfig){
show_json('needConfig',false);
}
}
$model->changeStatus($app,$status);
$list = $model->viewList();
show_json($list);
}
public function setConfig(){
if( !$this->in['app'] ||
!$this->in['value']){
show_json(LNG('data_not_full'),false);
}
$json = $this->in['value'];
$app = $this->in['app'];
$model = $this->loadModel('Plugin');
//重置为默认配置
if($json == 'reset'){
$json = $model->getConfigDefault($app);
}else{
if(!is_array($json)){
show_json($json,false);
}
}
$model->changeStatus($app,1);
$model->setConfig($app,$json);
show_json(LNG('success'));
}
// download=>fileSize=>unzip=>remove
public function install(){
if(!preg_match("/^[0-9a-zA-Z_]*$/",$this->in['app'])) show_json("error!",false);
$app = _DIR_CLEAR($this->in['app']);
$appPath = PLUGIN_DIR.$app.'.zip';
$appPathTemp = $appPath.'.downloading';
switch($this->in['step']){
case 'check':
$info = $this->pluginInfo($app);
if(!is_array($info)){
show_json(false,false);
}
echo json_encode($info);
break;
case 'download':
if(!is_writable(PLUGIN_DIR)){
show_json(LNG("no_permission_write").': '.PLUGIN_DIR,false);
}
$info = $this->pluginInfo($app);
if(!$info || !$info['code']){
show_json(LNG('error'),false);
}
$result = Downloader::start($info['data'],$appPath);
show_json($result['data'],!!$result['code'],$app);
break;
case 'fileSize':
if(file_exists($appPath)){
show_json(filesize($appPath));
}
if(file_exists($appPathTemp)){
show_json(filesize($appPathTemp));
}
show_json(0,false);
break;
case 'unzip':
//hook log
$GLOBALS['isRoot'] = 1;
if(!file_exists($appPath)){
show_json(LNG("error"),false);
}
$result = KodArchive::extract($appPath,PLUGIN_DIR.$app.'/');
del_file($appPathTemp);
del_file($appPath);
show_json($result['data'],!!$result['code']);
break;
case 'remove':
del_file($appPathTemp);
del_file($appPath);
show_json(LNG('success'));
break;
case 'update':
show_json(Hook::apply($app.'Plugin.update'));
break;
default:break;
}
}
private function pluginInfo($app){
$api = $this->config['settings']['pluginServer'].'plugin/install';
$param = array(
"app" => $app,
"version" => KOD_VERSION,
"versionHash" => $this->config['settingSystem']['versionHash'],
"systemOS" => $this->config['systemOS'],
"phpVersion" => PHP_VERSION,
"channel" => INSTALL_CHANNEL,
"lang" => I18n::getType()
);
$info = url_request($api,'POST',$param);
$result = false;
if($info && $info['data']){
$result = json_decode($info['data'],true);
}
return $result;
}
public function unInstall(){
if( !$this->in['app']){
show_json(LNG('data_not_full'),false);
}
if(!preg_match("/^[0-9a-zA-Z_]*$/",$this->in['app'])) show_json("error!",false);
$model = $this->loadModel('Plugin');
$model->remove($this->in['app']);
del_dir(PLUGIN_DIR.$this->in['app']);
$list = $model->viewList();
show_json($list);
}
}
@@ -0,0 +1,147 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
class setting extends Controller{
private $sql;
function __construct(){
parent::__construct();
}
/**
* 用户首页展示
*/
public function index() {
$this->display('index.html');
}
/**
* 用户首页展示
*/
public function slider() {
switch ($this->in['slider']) {
case 'about':show_json(file_get_contents(LANGUAGE_PATH.I18n::getType().'/about.html'));break;
case 'help':show_json(file_get_contents(LANGUAGE_PATH.I18n::getType().'/help.html'));break;
case 'member':break;
case 'fav':break;
case 'user':
case 'theme':
case 'wall':
show_json(array(
'settingAll' => $this->config['settingAll'],
'user' => $this->config['user'],
'wallpageDesktop' => $this->config['settingSystem']['wallpageDesktop'],
'wallpageLogin' => $this->config['settingSystem']['wallpageLogin'],
));
break;
case 'system':
if($GLOBALS['isRoot']){
if(isset($this->in['env_check'])){
show_json(php_env_check());
}
$result = $this->config['settingSystem'];
unset($result['systemPassword']);
show_json($result,true);
}else{
show_json('error',false);
}
break;
default:break;
}
}
public function phpInfo(){
phpinfo();
}
//管理员 系统设置全局数据
public function systemSetting(){
$settingFile = USER_SYSTEM.'system_setting.php';
$data = json_decode($this->in['data'],true);
if (!$data) {
show_json(LNG('error'),false);
}
$setting = $GLOBALS['config']['settingSystem'];
foreach ($data as $key => $value){
if ($key=='menu') {
$setting[$key] = $value;
}else{
$setting[$key] = rawurldecode($value);
}
}
//为了保存更多的数据;不直接覆盖文件 $data->setting_file;
FileCache::save($settingFile,$setting);
show_json(LNG('success'));
}
public function systemTools(){
$action = $this->in['action'];
switch($action){
case 'clearCache':$this->_clearCache();break;
case 'clearSession':$this->_clearSession();break;
case 'clearUserRecycle':$this->_clearUserRecycle();break;
default:break;
}
show_json(LNG('success'),true);
}
private function _clearSession(){
del_dir(KOD_SESSION);
}
private function _clearCache(){
del_dir(TEMP_PATH);
mk_dir(TEMP_PATH.'log');
mk_dir(TEMP_PATH.'thumb');
}
private function _clearUserRecycle(){
$sql = systemMember::loadData();
$user_arr = $sql->get();
foreach ($user_arr as $key => $user) {
$userPath = iconv_system(USER_PATH.$user['path']."/");
$pathArr = array(
$userPath.'data/temp',
$userPath.'data/share_temp',
$userPath.'recycle_kod'
);
foreach ($pathArr as $value) {
del_dir($value);
mk_dir($value);
}
}
}
/**
* 参数设置
* 可以同时修改多个:key=a,b,c&value=1,2,3
* 防xss 做过滤
*/
public function set(){
$file = USER.'data/config.php';
if (!path_writeable(iconv_system($file))) {//配置不可写
show_json(LNG('no_permission_write_file'),false);
}
$key = $this->in['k'];
$value = $this->in['v'];
if ($key !='' && $value != '') {
$conf = $this->config['user'];
if(!strpos($key,',')){//多个参数,value不能包含','
$conf[$key] = clear_html($value);
}else{
$arr_k = explode(',', $key);
$arr_v = explode(',',$value);
$num = count($arr_k);
for ($i=0; $i < $num; $i++) {
$conf[$arr_k[$i]] = clear_html($arr_v[$i]);
}
}
FileCache::save($file,$conf);
show_json(LNG('setting_success'));
}else{
show_json(LNG('error'),false);
}
}
}
+631
View File
@@ -0,0 +1,631 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
class share extends Controller{
private $sql;
private $shareInfo;
private $sharePath;
private $path;
function __construct(){
parent::__construct();
$auth = systemRole::getInfo(1);//经过role检测
$arrNotCheck = array('commonJs','manifest','manifestJS');
if(substr($this->in['fileUrl'],0,4) == 'http'){
$arrNotCheck[] = 'fileGet';
}
if (!in_array(ACT,$arrNotCheck)){
$this->initShare();
$this->checkShare();
$this->assign('canDownload',$this->shareInfo['notDownload']=='1'?0:1);
}
//需要检查下载权限的Action
$arrCheckDownload = array('fileDownload','zipDownload');//'fileProxy','fileGet'
if (in_array(ACT,$arrCheckDownload)){
if ($this->shareInfo['notDownload']=='1') {
show_json(LNG('share_not_download_tips'),false);
}
}
}
private function initShare(){
if(isset($this->in['user'])){
$this->initShareOld();
return;
}
$this->path = _DIR($this->in['path']);
$this->shareInfo = $GLOBALS['kodShareInfo'];
$user = systemMember::getInfo($GLOBALS['kodPathId']);
$userHome = user_home_path($user);
define('USER',USER_PATH.$user['path'].'/');
define('USER_TEMP',USER.'data/share_temp/');
define('HOME',$userHome);
}
private function checkShare(){
$shareInfo = $this->shareInfo;
if(!$this->shareInfo){
$this->_error(LNG('share_error_user'));
}
if (isset($shareInfo['timeTo'])&&
strlen($shareInfo['timeTo'])!=0) {
$date = strtotime($shareInfo['timeTo']);
if (time() > $date) {
$this->_error(LNG('share_error_time'));
}
}
//密码检测
if ($shareInfo['sharePassword']=='') return;
if (!isset($this->in['password'])){
if ($_SESSION['password_'.$this->in['sid']]==$shareInfo['sharePassword']){
return;
}
$this->_error('password');
}else{
if ($this->in['password'] == $shareInfo['sharePassword']) {
session_start();
$_SESSION['password_'.$this->in['sid']]=$shareInfo['sharePassword'];
session_write_close();
show_json('success');
}else{
show_json(LNG('share_error_password'),false);
}
}
}
private function initShareOld(){
if (!isset($this->in['user']) || !isset($this->in['sid'])) {
$this->_error(LNG('share_error_param'));
}
$member = systemMember::loadData();
$user = $member->get($this->in['user']);
if (!is_array($user) || !isset($user['password'])){
$this->_error(LNG('share_error_user'));
}
$userHome = user_home_path($user);
define('USER',USER_PATH.$user['path'].'/');
define('USER_TEMP',USER.'data/share_temp/');
define('HOME',$userHome);
$shareData = USER_PATH.$user['path'].'/data/share.php';
if (!file_exists(iconv_system($shareData))) {
$this->_error(LNG('share_error_user'));
}
$this->sql=new FileCache($shareData);
$list = $this->sql->get();
if (!isset($this->in['sid']) ||! $list[$this->in['sid']]){
$this->_error(LNG('share_error_sid'));
}
$this->shareInfo = $list[$this->in['sid']];
$sharePath = _DIR_CLEAR($this->shareInfo['path']);
if ($user['role'] != '1') {
$sharePath = HOME.ltrim($sharePath,'/');
}
if ($this->shareInfo['type'] != 'file'){
$sharePath=rtrim($sharePath,'/').'/';
}
$sharePath = iconv_system($sharePath);
if (!file_exists($sharePath)) {
$this->_error(LNG('share_error_path'));
}
$this->sharePath = $sharePath;
if($this->shareInfo['type'] == 'file'){
$this->path = $sharePath;
}else if(isset($this->in['path'])){
$this->path = $sharePath.$this->_clear($this->in['path']);
}else{
$this->path = $sharePath;
}
$this->path = _DIR_CLEAR($this->path);
$GLOBALS['kodPathPre'] = iconv_app(_DIR_CLEAR($sharePath));
//debug_out($GLOBALS['kodPathPre'],$GLOBALS['kodPathId'],$this->shareInfo,$this->path,$sharePath);
}
private function _clear($path){
return iconv_system(_DIR_CLEAR($path));
}
private function _error($msg){
$this->assign('configTheme','mac');
$this->assign('msg',$msg);
$this->display('tips.html');
exit;
}
//==========================
//页面统一注入变量
private function _assignInfo(){
$config = FileCache::load(USER.'data/config.php');
if (count($config)<1) {
$config = $GLOBALS['config']['settingDefault'];
}
$this->assign('configTheme',$config['theme']);
$this->shareInfo['sharePassword'] = '';
$this->shareInfo['path'] = get_path_this(iconv_app($this->path));
$this->assign('shareInfo',$this->shareInfo);
}
//下载次数统计
private function _shareDownloadAdd(){
$this->shareInfo['numDownload'] = abs(intval($this->shareInfo['numDownload'])) +1;
$this->sql->set($this->in['sid'],$this->shareInfo);
}
//==========================
/*
* 文件浏览
*/
public function file() {
$this->shareViewAdd();
if ($this->shareInfo['type']!='file') {
//$this->shareInfo['name'] = get_path_this($this->path);
}
$size = filesize($this->path);
$this->shareInfo['size'] = size_format($size);
$this->_assignInfo();
$this->display('file.html');
}
/*
* 文件夹浏览
*/
public function folder() {
$this->shareViewAdd();
if(isset($this->in['path']) && $this->in['path'] !=''){
$dir = '/'._DIR_CLEAR($this->in['path']);
}else{
$dir = '/';//首次进入系统,不带参数
}
$dir = '/'.trim($dir,'/').'/';
$this->_assignInfo();
$this->assign('dir',$dir);
if ($this->config['forceWap']) {
$this->display('explorerWap.html');
}else{
$this->display('explorer.html');
}
}
/*
* 代码阅读
*/
public function codeRead() {
$this->shareViewAdd();
$this->_assignInfo();
$this->display('editor.html');
}
//浏览次数统计
private function shareViewAdd(){
$this->shareInfo['numDownload'] = isset($this->shareInfo['numDownload'])?$this->shareInfo['numDownload']:0;
$this->shareInfo['numView'] = isset($this->shareInfo['numView'])?$this->shareInfo['numView']:0;
$this->shareInfo['numView'] = abs(intval($this->shareInfo['numView'])) +1;
$this->sql->set($this->in['sid'],$this->shareInfo);
}
public function commonJs(){
$out = ob_get_clean();
$versionDesc = isset($this->config['settings']['versionDesc'])?$this->config['settings']['versionDesc']:"";
$theConfig = array(
'environment' => STATIC_JS,
'lang' => I18n::getType(),
'systemOS' => $this->config['systemOS'],
'isRoot' => 0,
'webRoot' => '',
'webHost' => HOST,
'appHost' => APP_HOST,
'staticPath' => STATIC_PATH,
'appIndex' => $_SERVER['SCRIPT_NAME'],
'version' => KOD_VERSION,
'versionBuild' => KOD_VERSION_BUILD,
'versionDesc' => $versionDesc,
'kodID' => md5(BASIC_PATH.$this->config['settingSystem']['systemPassword']),
'jsonData' => "",
'sharePage' => 'share',
'settings' => array(
'updloadChunkSize' => file_upload_size(),
'updloadThreads' => $this->config['settings']['updloadThreads'],
'updloadBindary' => $this->config['settings']['updloadBindary'],
'uploadCheckChunk' => $this->config['settings']['uploadCheckChunk'],
'paramRewrite' => $this->config['settings']['paramRewrite'],
'pluginServer' => $this->config['settings']['pluginServer'],
//'appType' => $this->config['settings']['appType']
),
//虚拟目录
'KOD_GROUP_PATH' => KOD_GROUP_PATH,
'KOD_GROUP_SHARE' => KOD_GROUP_SHARE,
'KOD_USER_SELF' => KOD_USER_SELF,
'KOD_USER_SHARE' => KOD_USER_SHARE,
'KOD_USER_RECYCLE' => KOD_USER_RECYCLE,
'KOD_USER_FAV' => KOD_USER_FAV,
'KOD_GROUP_ROOT_SELF' => KOD_GROUP_ROOT_SELF,
'KOD_GROUP_ROOT_ALL' => KOD_GROUP_ROOT_ALL,
'ST' => $this->in['st'],
'ACT' => $this->in['act'],
);
if(ST.''.ACT == 'explorer.fileView'){
unset($theConfig['sharePage']);
}
$userConfig = $GLOBALS['config']['settingDefault'];
if(isset($this->in['user'])){
$member = systemMember::loadData();
$user = $member->get($this->in['user']);
$userConfig = FileCache::load(USER_PATH.$user['path'].'/'.'data/config.php');
}
if(isset($this->config['settingSystem']['versionHash'])){
$theConfig['versionHash'] = $this->config['settingSystem']['versionHash'];
$theConfig['versionHashUser'] = $this->config['settingSystem']['versionHashUser'];
}
$theConfig['userConfig'] = $userConfig;
$useTime = mtime() - $GLOBALS['config']['appStartTime'];
header("Content-Type: application/javascript; charset=utf-8");
echo 'if(typeof(kodReady)=="undefined"){kodReady=[];}';
Hook::trigger('user.commonJs.insert',$this->in['st'],$this->in['act']);
echo ';AUTH=[];';
echo 'G='.json_encode($theConfig).';';
$lang = json_encode_force(I18n::getAll());
if(!$lang){
$lang = '{}';
}
echo 'LNG='.$lang.';G.useTime='.$useTime.';';
}
//chrome安装: 必须https;serviceWorker引入处理;manifest配置; [manifest.json配置目录同sw.js引入];
public function manifest(){
$json = file_get_contents(BASIC_PATH.'static/others/app/manifest.json');
$name = stristr(I18n::getType(),'zh') ? '可道云':'kodExplorer';
$static = STATIC_PATH == './static/' ? APP_HOST.'static/':STATIC_PATH;
$assign = array(
"{{name}}" => $name,
"{{appDesc}}" => LNG('common.copyright.name'),
"{{static}}" => $static,
);
$json = str_replace(array_keys($assign),array_values($assign),$json);
header("Content-Type: application/javascript; charset=utf-8");
echo $json;
}
public function manifestJS(){
header("Content-Type: application/javascript; charset=utf-8");
echo file_get_contents(BASIC_PATH.'static/others/app/sw.js');
}
//========ajax function============
public function pathInfo(){
$infoList = json_decode($this->in['dataArr'],true);
foreach ($infoList as &$val) {
$val['path'] = $this->sharePath.$this->_clear($val['path']);
}
$data = path_info_muti($infoList,LNG('time_type_info'));
$data['path'] = _DIR_OUT($data['path']);
//属性查看,单个文件则生成临时下载地址。没有权限则不显示
if (count($infoList)==1 && $infoList[0]['type']!='folder') {//单个文件
$file = $infoList[0]['path'];
if($this->shareInfo['notDownload']!='1'){
$data['downloadPath'] = _make_file_proxy($file);
}
if($data['size'] < 100*1024|| isset($this->in['getMd5'])){
$data['fileMd5'] = @md5_file($file);
}else{
$data['fileMd5'] = "...";
}
//获取图片尺寸
$ext = get_path_ext($file);
if(in_array($ext,array('jpg','gif','png','jpeg','bmp')) ){
$size = ImageThumb::imageSize($file);
if($size){
$data['imageSize'] = $size;
}
}
}
show_json($data);
}
public function fileSave(){
show_json(LNG('no_permission'),false);
}
// 单文件编辑
public function edit(){
$member = systemMember::loadData();
$user = $member->get($this->in['user']);
$codeConfig = FileCache::load(USER_PATH.$user['path'].'/data/editor_config.php');
if(!is_array($codeConfig)){
$codeConfig = $GLOBALS['config']['editorDefault'];
}
$black_theme = array("ambiance","idle_fingers","monokai","pastel_on_dark","twilight",
"solarized_dark","tomorrow_night_blue","tomorrow_night_eighties");
$setClass = "";
if(in_array($codeConfig['theme'],$black_theme)){
$setClass = 'class="code-theme-black"';
}
$this->_assignInfo();
$this->assign('editorConfig',json_encode($codeConfig));//获取编辑器配置信息
$this->assign('codeThemeBlack',$setClass);//获取编辑器配置信息
$this->display('edit.html');
}
public function pathList(){
$list=$this->_path($this->path);
show_json($list);
}
public function treeList(){
$path=$this->path;
if (isset($this->in['project'])) {
$path = $this->sharePath.$this->_clear($this->in['project']);
}
if (isset($this->in['path'])) {
$path = $this->sharePath.$this->_clear($this->in['path']);
}
if (isset($this->in['name'])){
$path=$path.'/'.$this->_clear($this->in['name']);
}
$listFile = ($this->in['app'] == 'editor'?true:false);//编辑器内列出文件
$list=$this->_path($path,$listFile,true);
function sort_by_key($a, $b){
if ($a['name'] == $b['name']) return 0;
return ($a['name'] > $b['name']) ? 1 : -1;
}
usort($list['folderList'], "sort_by_key");
usort($list['fileList'], "sort_by_key");
$result = array_merge($list['folderList'],$list['fileList']);
if ($this->in['app'] != 'editor') {
$result =$list['folderList'];
}
if (isset($this->in['type']) && $this->in['type']=='init') {
$result = array(
array(
'name' => iconv_app(get_path_this($path)),
'children' => $result,
//'menuType' => "menuTreeRoot",
'open' => true,
'type' => 'folder',
'path' => '/',
'isParent' => count($result)>0?true:false
)
);
}
show_json($result);
}
public function search(){
if (!isset($this->in['search'])) show_json(LNG('please_inpute_search_words'),false);
$isContent = intval($this->in['is_content']);
$isCase = intval($this->in['is_case']);
$ext= trim($this->in['ext']);
$list = path_search(
$this->path,
rawurldecode($this->in['search']),
$isContent,$ext,$isCase);
show_json(_DIR_OUT($list));
}
/**
* 上传,html5拖拽 flash 多文件
*/
public function fileUpload(){
$fileName = $_FILES['file']['name']? $_FILES['file']['name']:$GLOBALS['in']['name'];
$GLOBALS['isRoot']=0;
$GLOBALS['auth']['extNotAllow'] = "htm|html|php|phtml|pwml|asp|aspx|ascx|jsp|pl|htaccess|shtml|shtm|phtm";
if(!checkExt($fileName)){
show_json(LNG('no_permission_ext'),false);
}
$savePath = $this->sharePath.$this->_clear($this->in['upload_to']);
if (!path_writeable($savePath)) show_json(LNG('no_permission_write'),false);
if ($savePath == '') show_json(LNG('upload_error_big'),false);
if (strlen($this->in['fullPath']) > 1) {//folder drag upload
$fullPath = _DIR_CLEAR(rawurldecode($this->in['fullPath']));
$fullPath = get_path_father($fullPath);
$fullPath = iconv_system($fullPath);
if (mk_dir($savePath.$fullPath)) {
$savePath = $savePath.$fullPath;
}
}
//分片上传
$tempDir = iconv_system(USER_TEMP);
mk_dir($tempDir);
if (!path_writeable($tempDir)) show_json(LNG('no_permission_write'),false);
upload($savePath,$tempDir,'rename');
}
//代理输出
public function fileProxy(){
$mime = get_file_mime(get_path_ext($this->path));
if($mime == 'text/plain' && is_file($this->path)){//文本则转编码
$fileContents = file_get_contents($this->path);
$charset=get_charset($fileContents);
if ($charset!='' || $charset!='utf-8') {
$fileContents=mb_convert_encoding($fileContents,'utf-8',$charset);
}
echo $fileContents;
return;
}
$download = isset($_GET['download']);
$filename = isset($_GET['downFilename'])?$_GET['downFilename']:false;
file_put_out($this->path,$download,$filename);
}
public function fileDownload(){
$this->_shareDownloadAdd();
file_put_out($this->path,true);
}
//文件下载后删除,用于文件夹下载
public function fileDownloadRemove(){
if ($this->shareInfo['notDownload']=='1') {
show_json(LNG('share_not_download_tips'),false);
}
$path = get_path_this(_DIR_CLEAR($this->in['path']));
$path = iconv_system(USER_TEMP.$path);
file_put_out($path,true);
del_file($path);
}
public function zipDownload(){
$this->_shareDownloadAdd();
$userTemp = iconv_system(USER_TEMP);
if(!file_exists($userTemp)){
mkdir($userTemp);
}else{//清除未删除的临时文件,一天前
$list = path_list($userTemp,true,false);
$maxTime = 3600*24;
if ($list['fileList']>=1) {
for ($i=0; $i < count($list['fileList']); $i++) {
$createTime = $list['fileList'][$i]['mtime'];//最后修改时间
if(time() - $createTime >$maxTime){
del_file($list['fileList'][$i]['path'].$list['fileList'][$i]['name']);
}
}
}
}
$zipFile = $this->zip($userTemp);
show_json(LNG('zip_success'),true,get_path_this($zipFile));
}
private function zip($zipPath){
if (!isset($zipPath)) {
show_json(LNG('share_not_download_tips'),false);
}
ignore_timeout();
$zipList = json_decode($this->in['dataArr'],true);
$listNum = count($zipList);
$files = array();
for ($i=0; $i < $listNum; $i++) {
$item = $this->path.$this->_clear($zipList[$i]['path']);
if(file_exists($item)){
$files[] = $item;
}
}
if(count($files)==0){
show_json(LNG('not_exists'),false);
}
//指定目录
if (count($files) == 1) {
$pathThisName=get_path_this($files[0]);
}else{
$pathThisName=get_path_this(get_path_father($files[0]));
}
$zipname = $zipPath.$pathThisName.'.zip';
$zipname = get_filename_auto($zipname,date('_H-i-s'));
KodArchive::create($zipname,$files);
return iconv_app($zipname);
}
// 获取文件数据
public function fileGet(){
if(isset($this->in['fileUrl'])){ //http
$displayName = $this->in['name'];
$filepath = $this->in['fileUrl'];
if(!request_url_safe($filepath)){
show_json(LNG('url error!'),false);
}
}else{
$displayName = _DIR_CLEAR($this->in['filename']);
$filepath= $this->sharePath.iconv_system($displayName);
if (!path_readable($filepath)){
show_json(LNG('no_permission_read'),false);
}
if (filesize($filepath) >= 1024*1024*20){
show_json(LNG('edit_too_big'),false);
}
if (!file_exists($filepath)){
show_json(LNG('not_exists'),false);
}
}
$fileContents=file_get_contents($filepath);//文件内容
$charset=get_charset($fileContents);
if ($charset!='' &&
$charset!='utf-8' &&
function_exists("mb_convert_encoding")
){
$fileContents=@mb_convert_encoding($fileContents,'utf-8',$charset);
}
$data = array(
'ext' => get_path_ext($displayName),
'name' => iconv_app(get_path_this($displayName)),
'filename' => $displayName,
'charset' => $charset,
'base64' => true,// 部分防火墙编辑文件误判问题处理
'content' => base64_encode($fileContents)
);
show_json($data);
}
public function image(){
$thumbWidth = 250;
if(isset($this->in['thumbWidth'])){
$thumbWidth = intval($this->in['thumbWidth']);//自定义预览大图
}
if(substr($this->path,0,4) == 'http'){
header('Location: '.$this->in['path']);
exit;
}
if (@filesize($this->path) <= 1024*50 ||
!function_exists('imagecolorallocate') ||
get_path_ext($this->path) == 'gif') {//小于50k、不支持gd库、gif图 不再生成缩略图
file_put_out($this->path,false);
return;
}
if (!is_dir(DATA_THUMB)){
mk_dir(DATA_THUMB);
}
$image = $this->path;
$imageMd5 = @md5_file($image).'_'.$thumbWidth;//文件md5
if (strlen($imageMd5)<5) {
$imageMd5 = md5($image).'_'.$thumbWidth;
}
$imageThumb = DATA_THUMB.$imageMd5.'.png';
if (!file_exists($imageThumb)){//如果拼装成的url不存在则没有生成过
if (get_path_father($image)==DATA_THUMB){//当前目录则不生成缩略图
$imageThumb=$this->path;
}else {
$cm = new ImageThumb($image,'file');
$cm->prorate($imageThumb,$thumbWidth,$thumbWidth);//生成等比例缩略图
}
}
if (!file_exists($imageThumb) ||
filesize($imageThumb)<100){//缩略图生成失败则使用原图
$imageThumb=$this->path;
}
file_put_out($imageThumb,false);
file_put_out($imageThumb);//输出
}
//获取文件列表&哦exe文件json解析
private function _path($dir,$listFile=true,$check_children=false){
$list = path_list($dir,$listFile,true);
$listNew = array('fileList'=>array(),'folderList'=>array());
$pathHidden = $this->config['settingSystem']['pathHidden'];
$exName = explode(',',$pathHidden);
foreach ($list['fileList'] as $key => $val) {
if (in_array($val['name'],$exName)) continue;
if ($val['ext'] == 'oexe'){
$path = iconv_system($val['path']);
$json = json_decode(@file_get_contents($path),true);
if(is_array($json)) $val = array_merge($val,$json);
}
$listNew['fileList'][] = $val;
}
foreach ($list['folderList'] as $key => $val) {
if (in_array($val['name'],$exName)) continue;
$listNew['folderList'][] = $val;
}
$s = _DIR_OUT($listNew);
return _DIR_OUT($listNew);
}
}
@@ -0,0 +1,279 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
//群组管理【管理员调用,or组空间大小变更】
//根目录id为1==》共享空间
class systemGroup extends Controller{
public static $staticSql = null;
private $sql;
function __construct() {
parent::__construct();
$this->sql= self::loadData();
$this->_init();
}
//保证只加载一次文件
public static function loadData(){
if(is_null(self::$staticSql)){
self::$staticSql = systemGroupData();
}
return self::$staticSql;
}
public static function getInfo($theId){
$sql = self::loadData();
return $sql->get($theId);
}
/**
* 空间使用变更
* @param [type] $theId [userID or groupID]
* @param [type] $sizeAdd [变更的大小 sizeMax G为单位 sizeUse Byte为单位]
*/
public static function spaceChange($theId,$sizeAdd=false){
$sql = self::loadData();
$info = $sql->get($theId);
if(!is_array($info)){
show_json(LNG('data_not_full'),false);
}
if($sizeAdd===false){//重置用户空间;避免覆盖、解压等导致的问题
$pathinfo = _path_info_more(GROUP_PATH.$info['path'].'/');
$currentUse = $pathinfo['size'];
if(isset($info['homePath']) && file_exists(iconv_system($info['homePath']))){
$pathinfo = _path_info_more(iconv_system($info['homePath']));
$currentUse += $pathinfo['size'];
}
}else{
$currentUse = floatval($info['config']['sizeUse'])+floatval($sizeAdd);
}
$info['config']['sizeUse'] = $currentUse<0?0:$currentUse;
$sql->set($theId,$info);
}
/**
* 空间剩余检测
* 1073741824 —— 1G
*/
public static function spaceCheck($theId){
$sql = self::loadData();
$info = $sql->get($theId);
if(!is_array($info)){
show_json(LNG('data_not_full'),false);
}
$sizeUse = floatval($info['config']['sizeUse']);
$sizeMax = floatval($info['config']['sizeMax']);
if($sizeMax!=0 && $sizeMax*1073741824<$sizeUse){
show_json(LNG('space_is_full'),false);
}
}
//管理员调用
//===================
private function _init(){
if(count($this->sql->get()) > 0) return;
$default = array(
'1' =>array(
'groupID' => '1',
'name' => 'root',
'parentID' => '',
'children' => '',
'config' => array('sizeMax' => floatval(1.5),
'sizeUse' => floatval(1024*1024)),//总大小,目前使用大小
'path' => 'root',
'createTime'=> time(),
)
);
$this->sql->reset($default);
$this->initDir($default[0]['path']);
}
//删除 path id
public static function _filterList($list,$filter_key = 'path'){
if($GLOBALS['isRoot']) return $list;
foreach ($list as $key => &$val) {
unset($val[$filter_key]);
}
return $list;
}
public function get() {
$items = self::_filterList($this->sql->get());
show_json($items,true);
}
/**
* 群组添加
* systemGroup/add&name=t1&parentID=101&sizeMax=0
*/
public function add(){
if (!isset($this->in['name']) || //必填项
!isset($this->in['parentID']) ||
!isset($this->in['sizeMax'])
) show_json(LNG('data_not_full'),false);
//名称可以重复
$groupID = $this->sql->getMaxId().'';
$groupName = rawurldecode($this->in['name']);
$groupInfo = array(
'groupID' => $groupID,
'name' => $groupName,
'parentID' => $this->in['parentID'],
'children' => '',
'config' => array('sizeMax' => floatval($this->in['sizeMax']),//G
'sizeUse' => floatval(1024*1024)),//总大小,目前使用大小
'path' => make_path($groupName),
'createTime'=> time(),
);
if(file_exists(iconv_system(GROUP_PATH.$groupInfo['path'])) ){
$groupInfo['path'] = make_path($groupInfo['path'].'_'.$groupInfo['groupID']);
}
//用户组目录
if( isset($this->in['homePath'])){
$homePath = _DIR(rawurldecode($this->in['homePath']));
if(file_exists($homePath)){
$groupInfo['homePath'] = iconv_app($homePath);
}
}else{
unset($groupInfo['homePath']);
}
$this->_parentChildChange($groupInfo,true);//更新父节点
if ($this->sql->set($groupID,$groupInfo)) {
$this->initDir($groupInfo['path']);
show_json(LNG('success'));
}
show_json(LNG('error'),false);
}
/**
* 编辑 systemGroup/edit&groupID=101&name=warlee&sizeMax=0
*/
public function edit() {
if (!$this->in['groupID']) show_json(LNG('data_not_full'),false);
$groupInfo = $this->sql->get($this->in['groupID']);
if(!is_array($groupInfo)){//用户不存在
show_json(LNG('not_exists'),false);
}
//name sizeMax parentID
if(isset($this->in['name'])){
$groupInfo['name'] = rawurldecode($this->in['name']);
}
if(isset($this->in['sizeMax'])){
$groupInfo['config']['sizeMax'] = floatval($this->in['sizeMax']);
}
if( isset($this->in['parentID']) &&
$groupInfo['parentID']!= '' && //根目录不能修改父节点
$this->in['parentID']!=$groupInfo['parentID']){//父节点变更
$childChange = explode(',',$groupInfo['children']);
if( in_array($this->in['parentID'],$childChange)
|| $this->in['parentID'] == $this->in['groupID']){//不能移动到子节点;死循环
show_json(LNG('current_has_parent'),false);
}
self::spaceChange($this->in['groupID']);//重置用户使用空间
$this->_parentChildChange($groupInfo,false);//向所有父节点,删除包含此节点的children
$groupInfo['parentID'] = $this->in['parentID'];
$this->_parentChildChange($groupInfo,true);//向所有新的父节点,添加包含此节点的children
}
//用户组目录
if( isset($this->in['homePath'])){
$groupInfo['homePath'] = _DIR(rawurldecode($this->in['homePath']));
if(!file_exists($groupInfo['homePath'])){
show_json(LNG('not_exists'),false);
}
$groupInfo['homePath'] = iconv_app($groupInfo['homePath']);
}else{
unset($groupInfo['homePath']);
}
if($groupInfo != $this->sql->get($this->in['groupID'])){
$this->sql->set($this->in['groupID'],$groupInfo);
}
show_json(LNG('success'));
}
/**
* 删除 ?systemMember/del&userID=102
*/
public function del() {
if (!isset($this->in['groupID'])) show_json(LNG('data_not_full'),false);
if (strlen($this->in['groupID']) <= 1) show_json(LNG('default_user_can_not_do'),false);
$groupInfo = $this->sql->get($this->in['groupID']);
$this->_parentChildChange($groupInfo,false);//向所有父节点,删除包含此节点的children
$this->sql->set(//将该节点的子节点的父节点设置为根目录
array('parentID',$groupInfo["groupID"]),
array('parentID','1')
);
systemMember::groupRemoveUserUpdate($groupInfo["groupID"]);//用户所在组变更
$this->sql->remove($this->in['groupID']);
if( strlen($groupInfo['path'])!=0){
del_dir(iconv_system(GROUP_PATH.$groupInfo['path'].'/'));
show_json(LNG('success'));
}
show_json(LNG('error'),false);
}
//============内部处理函数=============
//回溯更改节点的children
private function _parentChildChange($groupInfo,$isAdd){
if(!is_array($groupInfo)){
show_json(LNG('not_exists'),false);
}
if($groupInfo['parentID'] == 1){
return;
}
$childChange = explode(',',$groupInfo['children']);
if($childChange[0]==''){
unset($childChange[0]);
}
$childChange[] = $groupInfo['groupID'];//包含当前
while(strlen($groupInfo['groupID'])>2){//节点id从100开始
$groupInfo = $this->sql->get($groupInfo['parentID']);
if(!is_array($groupInfo)){
show_json(LNG('not_exists'),false);
}
$childrenNew = explode(',',$groupInfo['children']);
if($childrenNew[0]==''){
unset($childrenNew[0]);
}
if($isAdd){//添加
foreach ($childChange as $key=>$val) {
$childrenNew[] = $val;
}
}else{//删除
foreach ($childrenNew as $key=>$val) {
if(in_array($val,$childChange))
unset($childrenNew[$key]);
}
}
$childStr = implode(',',$childrenNew);
if($childStr != $groupInfo['children']){//有变更
$groupInfo['children'] = $childStr;
$this->sql->set($groupInfo['groupID'],$groupInfo);
}
}
}
//
/**
*初始化用户数据和配置。
*/
public function initDir($path){
$root = array('home','data');
$newGroupFolder = $this->config['settingSystem']['newGroupFolder'];
$home = explode(',',$newGroupFolder);
$path = GROUP_PATH.$path.'/';
foreach ($root as $dir) {
mk_dir(iconv_system($path.$dir));
}
foreach ($home as $dir) {
mk_dir(iconv_system($path.'home/'.$dir));
}
}
}
@@ -0,0 +1,529 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
//用户管理【管理员配置用户,or用户空间大小变更】
class systemMember extends Controller{
public static $staticSql = null;
private $sql;
function __construct() {
parent::__construct();
$this->tpl = TEMPLATE.'member/';
$this->sql= self::loadData();
}
//保证只加载一次文件
public static function loadData(){
if(is_null(self::$staticSql)){
self::$staticSql = systemMemberData();
}
return self::$staticSql;
}
public static function getInfo($theId){
$sql = self::loadData();
return $sql->get($theId);
}
/**
* 空间使用变更
* @param [type] $theId [userID or groupID]
* @param [type] $sizeAdd [变更的大小 sizeMax G为单位 sizeUse Byte为单位]
*/
public static function spaceChange($theId,$sizeAdd=false){
$sql = self::loadData();
$info = $sql->get($theId);
if(!is_array($info)){
show_json(LNG('data_not_full'),false);
}
if($sizeAdd===false){//重置用户空间;避免覆盖、解压等导致的问题
$pathinfo = _path_info_more(iconv_system(USER_PATH.$info['path'].'/'));
$currentUse = $pathinfo['size'];
if(isset($info['homePath']) && file_exists(iconv_system($info['homePath']))){
$pathinfo = _path_info_more(iconv_system($info['homePath']));
$currentUse += $pathinfo['size'];
}
}else{
$currentUse = floatval($info['config']['sizeUse'])+floatval($sizeAdd);
}
$info['config']['sizeUse'] = $currentUse<0?0:$currentUse;
$sql->set($theId,$info);
}
/**
* 空间剩余检测
* 1073741824 —— 1G
*/
public static function spaceCheck($theId){
$sql = self::loadData();
$info = $sql->get($theId);
if(!is_array($info)){
show_json(LNG('data_not_full'),false);
}
$sizeUse = floatval($info['config']['sizeUse']);
$sizeMax = floatval($info['config']['sizeMax']);
if($sizeMax!=0 && $sizeMax*1073741824<$sizeUse){
show_json(LNG('space_is_full'),false);
}
}
// 组删除后,所属该组的用户都删除;全局调用
public static function groupRemoveUserUpdate($groupID){
$sql = self::loadData();
$userAll = $sql->get();
foreach ($userAll as $key => $val) {
if(in_array($groupID,array_keys($val['groupInfo']))){
unset($val['groupInfo'][$groupID]);
$sql->set($val['userID'],$val);
}
}
}
// 权限组删除,所属该组的用户删除权限id
public static function roleRemoveUserUpdate($roleId){
$sql = self::loadData();
$userAll = $sql->get();
foreach ($userAll as $key => $val) {
if($val['role'] == $roleId){
$val['role'] = '';
$sql->set($val['userID'],$val);
}
}
}
//获取当前用户在某个群组的权限id; false|[id]
//兼容旧版本 'read'|'write'|false
public static function userAuthGroup($groupID){
$result = self::_userAuthGroupRole($groupID);
if($result === false) return false;
$result = $result == 'read' ? "1" : $result;
$result = $result == 'write' ? "2" : $result;
if(!is_array($GLOBALS['config']['pathRoleGroup'][$result])){
$result = "1";
}
return $result;
}
//获取在某个组的用户
public static function userAtGroup($groupID){
$sql = self::loadData();
$allUser = self::_filterList($sql->get());
if($groupID=='0'){
return $allUser;
}
$selectUser = array();
foreach ($allUser as $val) {
if(isset($val['groupInfo'][$groupID])){
$selectUser[] = $val;
}
}
return $selectUser;
}
//缓存用户共享对象=======================================
public static function userShareSql($userID){
static $userShareArr;
if(!is_array($userShareArr)){
$userShareArr = array();
}
if(!isset($userShareArr[$userID])){
$userInfo = systemMember::getInfo($userID);
if(!isset($userInfo['path'])){
return;
}
$sql = new FileCache(USER_PATH.$userInfo['path'].'/data/share.php');
$userShareArr[$userID] = $sql;
}
return $userShareArr[$userID];
}
//获取某个用户共享列表
public static function userShareList($userID){
$sql = self::userShareSql($userID);
$list = $sql->get();
if($userID == $_SESSION['kodUser']['userID']){//自己的列表则展示密码;否则清空密码
return $list;
}
//含有密码则不罗列
foreach($list as $key=>&$val){
if($val['sharePassword']){
unset($list[$key]);
}
}
return $list;
}
//获取某个用户某个共享
public static function userShareGet($userID,$name){
$sql = self::userShareSql($userID);
return $sql->get('name',$name);
}
//判断自己对某个组的权限 return false/'read'/'write'
public static function _userAuthGroupRole($groupID){
$sql = self::loadData();
$userInfo = $sql->get($_SESSION['kodUser']['userID']);
$groupInfo = $userInfo['groupInfo'];//自己所在的组
if(!is_array($groupInfo)){
return false;
}
if(isset($groupInfo[$groupID])){
return $groupInfo[$groupID];
}
$role = false;
$plist = array();
foreach ($groupInfo as $key => $value) {//
$group = systemGroup::getInfo($key);//测试组,是否在用户所在组的子组
$arr = explode(',',$group['children']);
if (in_array($groupID,$arr)) {
//return $groupInfo[$key]; // 找到最近的父级部门,而非第一个
if(empty($plist)){
$plist = $arr;
$role = $groupInfo[$key];
}else if(in_array($group['groupID'], $plist)){
$plist = $arr;
$role = $groupInfo[$key];
}
}
}
return $role;
}
//删除 path id
public static function _filterList($list,$filter_key = 'path'){
if($GLOBALS['isRoot']) return $list;
foreach ($list as $key => &$val) {
unset($val[$filter_key]);
unset($val['password']);
}
return $list;
}
//后台管理=====================
//管理员调用===================
/**
* 获取用户列表数据,根据用户组筛选;默认输出所有用户
*/
public function get($groupID='0') {
$result = self::userAtGroup($groupID);
foreach($result as $key=>&$val){
unset($val['password']);
}
show_json($result);
}
/**
* 获取用户列表数据,根据用户组筛选;默认输出所有用户
*/
public function getByName($name = '') {
if(!$name){
$name = $this->in['name'];
}
$result = $this->sql->get(array('name',$name));
if(is_array($result) && count($result)>0){
$arr = array_values($result);
unset($arr[0]['password']);
show_json($arr[0]);
}
show_json(LNG("not_exists"),false);
}
/**
* 用户添加
* systemMember/add&name=warlee&password=123&sizeMax=0&groupInfo={"0":"read","10":"write"}&role=default
*/
public function add($user = false){
if (!isset($this->in['name']) || //必填项
!isset($this->in['password']) ||
!isset($this->in['role']) ||
!isset($this->in['groupInfo']) || //{"0":"read","100":"read"}
!isset($this->in['sizeMax'])
){
show_json(LNG('data_not_full'),false);
}
$name = trim(rawurldecode($this->in['name']));
$password = rawurldecode($this->in['password']);
$groupInfo = json_decode(rawurldecode($this->in['groupInfo']),true);
if(!is_array($groupInfo)){
show_json(LNG('systemMember_group_error'),false);
}
if($this->sql->get(array('name',$name))){
show_json(LNG('error_repeat'),false,$name);
}
//非系统管理员,不能添加系统管理员
if(!$GLOBALS['isRoot'] && $this->in['role']=='1'){
show_json(LNG('group_role_error'),false);
}
$userArray = array();
if(isset($this->in['isImport'])){
$arr = explode("\n",$name);
foreach($arr as $v){
if(trim($v)!=''){
$userArray[] = trim($v);
}
}
}else{
$userArray[] = $name;
}
$nickName = 0;
if(isset($this->in['nickName'])){
$nickName = trim(rawurldecode($this->in['nickName']));
}
//批量添加
$errorArr = array();
foreach ($userArray as $val) {
if($this->sql->get('name',$val)){//已存在
$errorArr[] = $val;
continue;
}
$userID = $this->sql->getMaxId().'';
$userInfo = array(
'userID' => $userID,
'name' => $val,
'nickName' => $nickName ? $nickName : $val,
'password' => md5($password),
'role' => $this->in['role'],
'config' => array('sizeMax' => floatval($this->in['sizeMax']),//M
'sizeUse' => 1024*1024),//总大小,目前使用大小
'groupInfo' => $groupInfo,
'path' => make_path($val),
'status' => 1, //0禁用;1启用
'lastLogin' => '', //最后登录时间 首次登陆则激活
'createTime'=> time(),
);
if(file_exists(iconv_system(USER_PATH.$userInfo['path'])) ){
$userInfo['path'] = $userInfo['path'].'_'.$userInfo['userID'];
}
//用户组目录
if( isset($this->in['homePath'])){
$homePath = _DIR(rawurldecode($this->in['homePath']));
if(file_exists($homePath)){
$userInfo['homePath'] = iconv_app($homePath);
}
}else{
unset($userInfo['homePath']);
}
if ($this->sql->set($userID,$userInfo)) {
$this->initDir($userInfo['path']);
}else{
$errorArr[] = $val;
}
}
$success = count($userArray)-count($errorArr);
$msg = LNG('success');
if(count($errorArr) > 0 ){
$msg = LNG('word_success').' : '.$success.', ';//部分失败
if($success == 0 ){
$msg = LNG('error_repeat');
}
$msg .= LNG('word_error').' : '.count($errorArr);
}
if($success==count($userArray)){
show_json($msg,true,$success);
}else{
show_json($msg,false,implode("\n",$errorArr));
}
}
/**
* 编辑 systemMember/edit&userID=101&name=warlee&password=123&sizeMax=0
* &groupInfo={%220%22:%22read%22,%22100%22:%22read%22}&role=default
*/
public function edit() {
if (!$this->in['userID']) show_json(LNG('data_not_full'),false);
$userID = $this->in['userID'];
$userInfo = $this->sql->get($userID);
if(!$userInfo){//用户不存在,或者默认用户不能修改
show_json(LNG('error'),false);
}
//非系统管理员,不能将别人设置为系统管理员
if(!$GLOBALS['isRoot'] && $this->in['role']=='1'){
show_json(LNG('group_role_error'),false);
}
//非系统管理员,不能修改系统管理员
if(!$GLOBALS['isRoot'] && $userInfo['role']=='1'){
show_json(LNG('group_role_error_admin'),false);
}
//管理员自己不能添加自己到非管理员组
if($GLOBALS['isRoot']
&& $_SESSION['kodUser']['userID']==$userID
&& $this->in['role']!='1'){
show_json(LNG('error'),false);
}
//修改为一个已存在的名字则提示
$theName = trim(rawurldecode($this->in['name']));
if($userInfo['name']!=$theName){
if($this->sql->get(array('name',$theName))){
show_json(LNG('error_repeat'),false);
}
}
$this->in['name'] = rawurlencode($theName);//还原
$editArr = array('name','nickName','role','password','groupInfo','homePath','status','sizeMax');
foreach ($editArr as $key) {
if(!isset($this->in[$key])) continue;
$userInfo[$key] = rawurldecode($this->in[$key]);
if($key == 'password'){
$userInfo['password'] = md5($userInfo[$key]);
}else if($key == 'sizeMax'){
$userInfo['config']['sizeMax'] = floatval($userInfo[$key]);
}else if($key == 'groupInfo'){//分组信息
$userInfo['groupInfo'] = json_decode(rawurldecode($this->in['groupInfo']),true);
}
}
//用户组目录
if( isset($this->in['homePath'])){
$userInfo['homePath'] = _DIR(rawurldecode($this->in['homePath']));
if(!file_exists($userInfo['homePath'])){
show_json(LNG('not_exists'),false);
}
$userInfo['homePath'] = iconv_app($userInfo['homePath']);
}else{
unset($userInfo['homePath']);
}
if($this->sql->set($userID,$userInfo)){
//self::spaceChange($userID);//重置用户使用空间
show_json(LNG('success'),true,$userInfo);
}
show_json(LNG('error_repeat'),false);
}
/**
* 用户批量操作 systemMember/doAction&action=&userID=[101,222,131]&param=
* action :
* -------------
* del 删除用户
* statusSet 启用&禁用 param=0/1
* roleSet 权限组 param=roleID
* groupReset 重置分组 param=group_json
* groupRemoveFrom 从某个组删除 param=groupID
* groupAdd 添加到某个分组 param=group_json
*/
public function doAction() {
if (!isset($this->in['userID'])){
show_json(LNG('username_can_not_null'),false);
}
$action = $this->in['action'];
$userArr = json_decode($this->in['userID'],true);
if(!is_array($userArr)){
show_json(LNG('error'),false);
}
if (in_array('1', $userArr)){//批量处理,不处理系统管理员admin
show_json(LNG('default_user_can_not_do'),false);
}
foreach ($userArr as $userID) {
switch ($action) {
case 'del'://删除
$userInfo = $this->sql->get($userID);
if($this->sql->remove($userID) && $userInfo['name']!=''){
del_dir(iconv_system(USER_PATH.$userInfo['path'].'/'));
}
break;
case 'statusSet'://禁用&启用
$status = intval($this->in['param']);
$this->sql->set(array('userID',$userID),array('status',$status));
break;
case 'spaceSet'://批量设置用户空间大小
$value = intval($this->in['param']);
$userInfo = $this->sql->get($userID);
$userInfo['config']['sizeMax'] = $value;
$this->sql->set($userID,$userInfo);
break;
case 'roleSet'://设置权限组
$role = $this->in['param'];
//非系统管理员,不能将别人设置为系统管理员
if(!$GLOBALS['isRoot'] && $role=='1'){
show_json(LNG('group_role_error'),false);
}
$this->sql->set(array('userID',$userID),array('role',$role));
break;
case 'groupReset'://设置分组
$groupArr = json_decode($this->in['param'],true);
if(!is_array($groupArr)){
show_json(LNG('error'),false);
}
$this->sql->set(array('userID',$userID),array('groupInfo',$groupArr));
break;
case 'groupRemoveFrom'://从某个组移除
$groupID = $this->in['param'];
$userInfo = $this->sql->get($userID);
unset($userInfo['groupInfo'][$groupID]);
$this->sql->set($userID,$userInfo);
break;
case 'groupAdd'://添加到某个组
$groupArr = json_decode($this->in['param'],true);
if(!is_array($groupArr)){
show_json(LNG('error'),false);
}
$userInfo = $this->sql->get($userID);
foreach ($groupArr as $key => $value) {
$userInfo['groupInfo'][$key] = $value;
}
$this->sql->set($userID,$userInfo);
default:break;
}
}
show_json(LNG('success'));
}
public function initInstall(){
$sql = systemMember::loadData();
$list = $sql->get();
foreach ($list as $id => &$info) {//创建用户目录及初始化
$path = make_path($info['name']);
$this->initDir($path);
$info['path'] = $path;
$info['createTime'] = time();
}
$sql->reset($list);
//初始化群组目录
$homeFolders = explode(',',$this->config['settingSystem']['newGroupFolder']);
$sql = systemGroup::loadData();
$list = $sql->get();
foreach ($list as $id => &$info) {//创建用户目录及初始化
$path = make_path($info['name']);
$rootPath = GROUP_PATH.$path.'/';
foreach ($homeFolders as $dir) {
mk_dir(iconv_system($rootPath.'home/'.$dir));
}
$info['path'] = $path;
$info['createTime'] = time();
}
$sql->reset($list);
}
//============内部处理函数=============
/**
*初始化用户数据和配置。
*/
public function initDir($path){
$userFolder = array('home','recycle_kod','data');
$homeFolders = explode(',',$this->config['settingSystem']['newUserFolder']);
$rootPath = USER_PATH.$path.'/';
foreach ($userFolder as $dir) {
mk_dir(iconv_system($rootPath.$dir));
}
foreach ($homeFolders as $dir) {
mk_dir(iconv_system($rootPath.'home/'.$dir));
}
FileCache::save($rootPath.'data/config.php',$this->config['settingDefault']);
}
}
@@ -0,0 +1,170 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
class systemRole extends Controller{
public static $staticSql = null;
private $sql;
function __construct(){
parent::__construct();
$this->sql= self::loadData();
}
//保证只加载一次文件
public static function loadData(){
if(is_null(self::$staticSql)){
self::$staticSql = systemRoleData();
}
return self::$staticSql;
}
public static function getInfo($theId){
$sql = self::loadData();
return $sql->get($theId);
}
//获取所有权限组
//用户组权限
public function get() {
if(isset($this->in['group_role'])){
$this->in['action'] == 'get';
$this->roleGroupAction();
}
show_json($this->sql->get());
}
/**
* 权限添加
*/
public function add(){
$role = $this->_initData();
$roleId = $role['roleID'] = $this->sql->getMaxId().'';
$this->_checkExist( $this->sql->get(),array('name',$role['name']),$roleId );
if ($this->sql->set($role['roleID'],$role)) {
show_json(LNG('success'),true,$role['roleID']);
}
show_json(LNG('error'),false);
}
/**
* 编辑
*/
public function edit(){
$role = $this->_initData();
$roleId = $this->in['roleID'];
$this->_checkExist( $this->sql->get(),array('name',$role['name']),$roleId );
if ($this->sql->set($roleId,$role)){
show_json(LNG('success'),true,$roleId);
}
show_json(LNG('error'),false);
}
/**
* 删除
*/
public function del() {
if (!isset($this->in['roleID'])) show_json(LNG('data_not_full'),false);
if (strlen($this->in['roleID']) <= 1) show_json(LNG('default_user_can_not_do'),false);
systemMember::roleRemoveUserUpdate($this->in['roleID']);//用户所在权限组变更
if($this->sql->remove($this->in['roleID'])){
show_json(LNG('success'));
}
show_json(LNG('error'),false);
}
/**
* 用户组权限列表配置
* 增删改查
*/
public function roleGroupAction(){
$sql = new FileCache(USER_SYSTEM.'system_role_group.php');
switch ($this->in['action']) {
case 'get':
$roleGroup = $sql->get();
if($roleGroup['1']['name'] == 'read'){
$roleGroup['1']['name'] = LNG('system_role_read');
}
if($roleGroup['2']['name'] == 'write'){
$roleGroup['2']['name'] = LNG('system_role_write');
}
show_json($roleGroup,true,$this->config['pathRoleDefine']);
break;
case 'add':
$roleId = $sql->getMaxId().'';
$roleArr = json_decode($this->in['role_arr'],true);
if(!is_array($roleArr)) show_json(LNG('error'),false);
if(!trim($roleArr['name'])) show_json(LNG("data_not_full"),false);
$this->_checkExist( $sql->get(),array('name',$roleArr['name']),$roleId);
if ($sql->set($roleId,$roleArr)) {
show_json(array($roleId),true,$sql->get());
}
show_json(LNG('error'),false);
break;
case 'set':
$roleId = $this->in['roleID'];
$roleArr = json_decode($this->in['role_arr'],true);
if(!is_array($roleArr)) show_json(LNG('error'),false);
if(!trim($roleArr['name'])) show_json(LNG("data_not_full"),false);
$this->_checkExist( $sql->get(),array('name',$roleArr['name']),$roleId);
if ($sql->set($roleId,$roleArr)){
show_json(LNG('success'),true,$sql->get());
}
show_json(LNG('error'),false);
break;
case 'del':
$roleId = $this->in['roleID'];
if(in_array($roleId,array("1","2"))){
show_json(LNG('default_user_can_not_do'),false);
}
if($sql->remove($this->in['roleID'])){
show_json(LNG('success'),true,$sql->get());
}
show_json(LNG('error'),false);
break;
default:break;
}
}
//检测是否存在
private function _checkExist($data,$find,$checkID){
$findData = array();
foreach ($data as $key => $val) {
if ($val[$find[0]] == $find[1]) {
$findData[$key] = $data[$key];
}
}
if(is_array($findData) && count($findData)>0 ){
$key = array_keys($findData);$key=$key[0];
if($key != $checkID) show_json(LNG("error_repeat"),false);
}
}
//===========内部调用============
/**
* 初始化数据 get
* 只传键即可 &extNotAllow='php,jsp'&explorer.mkfile=1&explorer.pathRname=1
*/
private function _initData(){
if (strlen($this->in['name'])<1) show_json(LNG('groupname_can_not_null'),false);
$roleArr = array(
'name' => rawurldecode($this->in['name']),
'extNotAllow' => $this->in['extNotAllow']
);
foreach ($this->config['roleSetting'] as $key => $actions) {
foreach ($actions as $action) {
$keyUrl = $key.'_'.$action;//url explorer.mkdir => explorer_mkdir;
$keyAuth = $key.'.'.$action;
if (isset($this->in[$keyUrl])){
$roleArr[$keyAuth] = 1;
}else{
$roleArr[$keyAuth] = 0;
}
}
}
return $roleArr;
}
}
+653
View File
@@ -0,0 +1,653 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
class user extends Controller{
private $user; //用户相关信息
private $auth; //用户所属组权限
private $notCheck;
function __construct(){
parent::__construct();
//php5.4 bug;需要重新读取一次
@session_start();
@session_write_close();
if(!isset($_SESSION)){//避免session不可写导致循环跳转
$this->login(DATA_PATH."<br/>".LNG('path_can_not_write_data') );
}else{
$this->user = &$_SESSION['kodUser'];
if(!isset($this->user['path']) && isset($this->user['name'])){//旧版本数据
$this->user['path'] = $this->user['name'];
}
}
//不需要判断的action
$this->notCheckST = array('share','debug');
$this->notCheckACT = array(
'loginFirst','login','logout','loginSubmit',
'checkCode','publicLink','qrcode','sso');
$this->notCheckApp = array();//'pluginApp.to'
if(!$this->user){
$this->notCheckApp = array('pluginApp.to','api.view');
}
$this->config['forceWap'] = is_wap() && (!isset($_COOKIE['forceWap']) || $_COOKIE['forceWap'] == '1');
if( isset($_GET['forceWap']) ){
$this->config['forceWap'] = $_GET['forceWap'];
}
}
public function bindHook(){
$this->loadModel('Plugin')->init();
$this->bindCheckPassword();
}
/**
* 登录状态检测;并初始化数据状态
*/
public function loginCheck(){
// CSRF-TOKEN更新后同步;关闭X-CSRF-TOKEN的httpOnly
if( ACT == 'commonJs' && isset($_SESSION['X-CSRF-TOKEN'])){
$this->_setCsrfToken();
}
if(in_array(ST,$this->notCheckST)) return;//不需要判断的控制器
if(in_array(ACT,$this->notCheckACT)) return;//不需要判断的action
if(in_array(ST.'.'.ACT,$this->notCheckApp)) return;//不需要判断的对应入口
if(isset($_SESSION['kodLogin']) && $_SESSION['kodLogin']===true && $this->user){
$user = systemMember::getInfo($this->user['userID']);
$this->_loginSuccess($user);
return;
}else if($_COOKIE['kodUserID']!='' && $_COOKIE['kodToken']!=''){
$user = systemMember::getInfo($_COOKIE['kodUserID']);
if (!is_array($user) || !isset($user['password'])) {
$this->logout();
}
if($this->_makeLoginToken($user) === $_COOKIE['kodToken']){
@session_start();//re start
$_SESSION['kodLogin'] = true;
$_SESSION['kodUser']= $user;
$_SESSION['X-CSRF-TOKEN'] = rand_string(20);
$this->_setCsrfToken();
setcookie('kodUserID', $_COOKIE['kodUserID'], time()+3600*24*100);
setcookie('kodToken',$_COOKIE['kodToken'],time()+3600*24*100);
//check if session work
@session_write_close();
unset($_SESSION);
@session_start();
if( !isset($_SESSION['kodUser']) ||
!is_array($_SESSION['kodUser'])){
$this->login(DATA_PATH."<br/>".LNG('path_can_not_write_data') );
}else{
$this->_loginSuccess($user);
}
return;
}
$this->logout();//session user数据不存在
}else{
if ($this->config['settingSystem']['autoLogin'] != '1') {
$this->logout();//不自动登录
}else{
if (!file_exists(USER_SYSTEM.'install.lock')) {
$this->display('install.html');
exit;
}
header('location:./index.php?user/loginSubmit&name=guest&password=guest');
exit;
}
}
}
private function _setCsrfToken(){
setcookie_header('X-CSRF-TOKEN',$_SESSION['X-CSRF-TOKEN'], time()+3600*24*100);
}
private function _loginSuccess($user){
$this->user = $user;
if(!$user){//false
show_tips('[Error Code:1001] user data error!');
}else if(!$user['path']){//服务器管理后立即生效
$this->login("Your 'path' is empty,please install again");
}else if($user['status'] == 0){
$this->login(LNG('login_error_user_not_use'));
}else if($user['role']==''){
$this->login(LNG('login_error_role'));
}
define('USER',USER_PATH.$this->user['path'].'/');//utf-8
define('USER_TEMP',USER.'data/temp/');
define('USER_RECYCLE',USER.'recycle_kod/');
@session_start();//re start
$_SESSION['kodUser']= $user;
@session_write_close();
if (!file_exists(iconv_system(USER))) {
$this->login("User/".get_path_this(USER)." ".LNG('not_exists'));
}
$user_home = user_home_path($this->user);//utf-8
define('HOME_PATH',$user_home);
if ($this->user['role'] == '1') {
define('MYHOME',$user_home);
define('HOME','');
$GLOBALS['webRoot'] = WEB_ROOT;//服务器目录
$GLOBALS['isRoot'] = 1;
}else{
define('HOME',$user_home);
define('MYHOME','/');
$GLOBALS['webRoot'] = '';//从服务器开始到用户目录
$GLOBALS['isRoot'] = 0;
}
$desktop = $this->config['settingSystem']['desktopFolder'];
if(isset($this->config['settingSystemDefault']['desktopFolder'])){
$desktop = $this->config['settingSystemDefault']['desktopFolder'];
}
define('DESKTOP_FOLDER',$desktop);
$this->config['user'] = FileCache::load(USER.'data/config.php');
if(!is_array($this->config['user'])){
$this->config['user'] = array();
}
foreach($this->config['settingDefault'] as $key=>$val){
if(!isset($this->config['user'][$key]) ){
$this->config['user'][$key] = $val;
}
}
}
private function _loginCheckPassword($user,$password){
if($this->checkPassword($password)) return;
if($user['role'] == '1'){ // 管理员,提示修改;
if(isset($_SESSION['adminPasswordTips'])) return;
@session_start();
$_SESSION['adminPasswordTips']= 1;
@session_write_close();
show_tips("安全提示:<br/><br/>密码长度必须大于6,同时包含英文和数字;<br/>强烈建议登陆后修改密码!",false);
}
show_tips("密码长度必须大于6,同时包含英文和数字;<br/>请联系管理员修改后再试!",false);
}
private function checkPassword($password){
if(defined('INSTALL_CHANNEL') && INSTALL_CHANNEL =='hikvision.com'){
$this->config['settingSystemDefault']['passwordCheck'] = '1';
}
if($this->config['settingSystemDefault']['passwordCheck'] == '0') return true;
$hasNumber = preg_match('/\d/',$password);
$hasChar = preg_match('/[A-Za-z]/',$password);
if( strlen($password) >= 6 && $hasNumber && $hasChar) return true;
return false;
}
private function bindCheckPassword(){
$action = strtolower(ST.'.'.ACT);
$check = array(
'user.changepassword' => 'passwordNew',
'systemmember.edit' => 'password',
'systemmember.add' => 'password',
);
if(!isset($check[$action])) return;
$password = $this->in[$check[$action]];
if($this->checkPassword($password)) return;
show_json("密码长度必须大于6,同时包含英文和数字;<br/>请联系管理员修改后再试!",false);
}
/**
* 共享kod登陆并跳转
* check: 校验方式:userID|userName|roleID|roleName|groupID|groupName,为空则所有登陆用户
* value: 对应的值
* link : 登陆后的跳转链接
*/
public function sso(){
$result = false;
$error = "未登录!";
if(!isset($_SESSION) || $_SESSION['kodLogin'] != 1){//避免session不可写导致循环跳转
$this->login($error);
}
$user = $_SESSION['kodUser'];
//admin 或者不填则允许所有kod用户登陆
if( $user['role'] == '1' ||
!isset($this->in['check']) ||
!isset($this->in['value']) ){
$result = true;
}
$checkValue = false;
switch ($this->in['check']) {
case 'userID':$checkValue = $user['userID'];break;
case 'userName':$checkValue = $user['name'];break;
case 'roleID':$checkValue = $user['role'];break;
case 'roleName':
$role = systemRole::getInfo($user['role']);
$checkValue = $role['name'];
break;
case 'groupID':
$checkValue = array_keys($user['groupInfo']);
break;
case 'groupName':
$checkValue = array();
foreach ($user['groupInfo'] as $groupID=>$val){
$item = systemGroup::getInfo($groupID);
$checkValue[] = $item['name'];
}
break;
default:break;
}
if(!$result && $checkValue != false){
if( (is_string($checkValue) && $checkValue == $this->in['value']) ||
(is_array($checkValue) && in_array($this->in['value'],$checkValue))
){
$result = true;
}else{
$error = clear_html($this->in['check']).' 没有权限, 配置权限需要为: "'
.clear_html($this->in['value']).'"';
}
}
if($result){
include(LIB_DIR.'api/sso.class.php');
SSO::sessionSet($this->in['app']);
header('location:'.$this->in['link']);
exit;
}
$this->login($error);
}
public function accessToken(){
if($_SESSION['kodLogin'] === true){
show_json(access_token_get(),true);
}else{
show_json('not login!',false);
}
}
//临时文件访问
public function publicLink(){
$pass = $this->config['settingSystem']['systemPassword'];
$fid = $this->in['fid'];//$this->in['fid'] 第三项
$path = Mcrypt::decode($fid,$pass);
if (strlen($path) == 0) {
show_json(LNG('error'),false);
}
$download = isset($_GET['download']);
$filename = isset($_GET['downFilename'])?$_GET['downFilename']:false;
file_put_out($path,$download,$filename);
}
public function commonJs(){
$out = ob_get_clean();
$basicPath = BASIC_PATH;
$userPath = USER_PATH;
$groupPath = GROUP_PATH;
if (!$GLOBALS['isRoot']) {//对非root用户隐藏地址
$basicPath = '/';
$userPath = '/';
$groupPath = '/';
}
$theConfig = array(
'environment' => STATIC_JS,
'lang' => I18n::getType(),
'systemOS' => $this->config['systemOS'],
'isRoot' => $GLOBALS['isRoot'],
'userID' => $this->user['userID'],
'webRoot' => $GLOBALS['webRoot'],
'webHost' => HOST,
'appHost' => APP_HOST,
'staticPath' => STATIC_PATH,
'appIndex' => $_SERVER['SCRIPT_NAME'],
'basicPath' => $basicPath,
'userPath' => $userPath,
'groupPath' => $groupPath,
'myhome' => MYHOME,
'myDesktop' => MYHOME.DESKTOP_FOLDER.'/',
'settings' => array(
'updloadChunkSize' => file_upload_size(),
'updloadThreads' => $this->config['settings']['updloadThreads'],
'updloadBindary' => $this->config['settings']['updloadBindary'],
'uploadCheckChunk' => $this->config['settings']['uploadCheckChunk'],
'paramRewrite' => $this->config['settings']['paramRewrite'],
'pluginServer' => $this->config['settings']['pluginServer'],
'appType' => $this->config['settings']['appType']
),
'phpVersion' => PHP_VERSION,
'version' => KOD_VERSION,
'versionBuild' => KOD_VERSION_BUILD,
'kodID' => md5(BASIC_PATH.$this->config['settingSystem']['systemPassword']),
'jsonData' => "",
'selfShare' => systemMember::userShareList($this->user['userID']),
'userConfig' => $this->config['user'],
'accessToken' => access_token_get(),
'versionEnv' => base64_encode(serverInfo()),
//虚拟目录
'KOD_GROUP_PATH' => KOD_GROUP_PATH,
'KOD_GROUP_SHARE' => KOD_GROUP_SHARE,
'KOD_USER_SELF' => KOD_USER_SELF,
'KOD_USER_SHARE' => KOD_USER_SHARE,
'KOD_USER_RECYCLE' => KOD_USER_RECYCLE,
'KOD_USER_FAV' => KOD_USER_FAV,
'KOD_GROUP_ROOT_SELF' => KOD_GROUP_ROOT_SELF,
'KOD_GROUP_ROOT_ALL' => KOD_GROUP_ROOT_ALL,
'ST' => $this->in['st'],
'ACT' => $this->in['act'],
);
if(isset($this->config['settingSystem']['versionHash'])){
$theConfig['versionHash'] = $this->config['settingSystem']['versionHash'];
$theConfig['versionHashUser'] = $this->config['settingSystem']['versionHashUser'];
}
if (!isset($GLOBALS['auth'])) {
$GLOBALS['auth'] = array();
}
$useTime = mtime() - $GLOBALS['config']['appStartTime'];
header("Content-Type: application/javascript; charset=utf-8");
echo 'if(typeof(kodReady)=="undefined"){kodReady=[];}';
Hook::trigger('user.commonJs.insert',$this->in['st'],$this->in['act']);
echo ';AUTH='.json_encode($GLOBALS['auth']).';';
echo 'G='.json_encode($theConfig).';';
$lang = json_encode_force(I18n::getAll());
if(!$lang){
$lang = '{}';
}
echo 'LNG='.$lang.';G.useTime='.$useTime.';';
}
public function appConfig(){
$theConfig = array(
'lang' => I18n::getType(),
'isRoot' => $GLOBALS['isRoot'],
'userID' => $this->user['userID'],
'myhome' => MYHOME,
'settings' => array(
'updloadChunkSize' => file_upload_size(),
'updloadThreads' => $this->config['settings']['updloadThreads'],
'uploadCheckChunk' => $this->config['settings']['uploadCheckChunk'],
),
'version' => KOD_VERSION,
'versionBuild' => KOD_VERSION_BUILD,
// 'userConfig' => $this->config['user'],
);
show_json($theConfig);
}
/**
* 登录view
*/
public function login($msg = ''){
if(isset($this->in['isAjax'])){
show_json($msg,false);
}
if (!file_exists(USER_SYSTEM.'install.lock')) {
chmod_path(BASIC_PATH,DEFAULT_PERRMISSIONS);
$this->display('install.html');
exit;
}
$this->assign('msg',$msg);
if (is_wap()) {
$this->display('loginWap.html');
}else{
$this->display('login.html');
}
exit;
}
/**
* 首次登录
*/
public function loginFirst(){
if (!file_exists(USER_SYSTEM.'install.lock')) {
touch(USER_SYSTEM.'install.lock');
if(!isset($this->in['password'])){
$this->in['password'] = 'admin';
}
$root = '1';
$sql = systemMember::loadData();
$user = array(//重置admin
'name' => 'admin',
'path' => "admin",
'password' => md5($this->in['password']),
'userID' => $root,
'role' => '1',
'config' => array('sizeMax'=>'0','sizeUse'=>1024),
'groupInfo' => array('1'=>'write'),
'createTime' => time(),
'status' => 1,
);
$sql->set($root,$user);
if( !$user['createTime'] ||
!$user['path'] ||
!file_exists(USER_PATH.$user['path'])
){
$member = new systemMember();
$member->initInstall();
}
}
header('location:./index.php?user/login');
exit;
}
/**
* 退出处理
*/
public function logout(){
session_start();
user_logout();
}
/**
* 登录数据提交处理;登陆跳转:
*
* 自动登陆:index.php?user/loginSubmit&name=guest&password=guest
* 登陆自动跳转:index.php?user/login&link=http://baidu.com
* api登陆:index.php?user/loginSubmit&login_token=ZGVtbw==|da9926fdab0c7c32ab2c329255046793
*/
public function loginSubmit(){
$apiLoginCheck = false;
if(isset($this->in['login_token'])){
$api_token = $this->config['settings']['apiLoginTonken'];
$param = explode('|',$this->in['login_token']);
if( strlen($api_token) < 5 ||
count($param) != 2 ||
md5(base64_decode($param[0]).$api_token) != $param[1]
){
$this->_loginDisplay("API 接口参数错误!",false);
}
$this->in['name'] = urlencode(base64_decode($param[0]));
$apiLoginCheck = true;
}else{
if(!isset($this->in['name']) || !isset($this->in['password'])) {
$this->_loginDisplay(LNG('login_not_null'),false);
}
if( need_check_code()
&& $this->in['name'] != 'guest'
&& $_SESSION['checkCode'] !== strtolower($this->in['checkCode']) ){
$this->_loginDisplay(LNG('code_error'),false);
}
}
$name = rawurldecode($this->in['name']);
$password = rawurldecode($this->in['password']);
if($this->in['salt']){
$key = substr($password,0,5)."2&$%@(*@(djfhj1923";
$password = Mcrypt::decode(substr($password,5),$key);
}
$member = systemMember::loadData();
$user = $member->get('name',$name);
if($apiLoginCheck && $user){//api自动登陆
}else if ($user === false || md5($password) !== $user['password']){
$this->_loginDisplay(LNG('password_error'),false);//$member->get()
}else if($user['status'] == 0){
$this->_loginDisplay(LNG('login_error_user_not_use'),false);
}else if($user['role']==''){
$this->_loginDisplay(LNG('login_error_role'),false);
}
//首次登陆,初始化app 没有最后登录时间
$this->_loginCheckPassword($user,$password);
$this->_loginSuccess($user);//登陆成功
if(!$user['lastLogin']){
$app = init_controller('app');
$app->initApp($user);
}
$user['lastLogin'] = time();//记录最后登录时间
$member->set($user['userID'],$user);
session_start();//re start 有新的修改后调用
$_SESSION['kodLogin'] = true;
$_SESSION['kodUser']= $user;
$_SESSION['X-CSRF-TOKEN'] = rand_string(20);
$this->_setCsrfToken();
setcookie('kodUserID', $user['userID'], time()+3600*24*100);
if ($this->in['rememberPassword'] == '1') {
setcookie('kodToken',$this->_makeLoginToken($user),time()+3600*24*100);
}
$this->_loginDisplay('ok',true);
}
private function _loginDisplay($msg,$success){
if(isset($this->in['isAjax'])){
if(isset($this->in['getToken']) && $success){
show_json(access_token_get(),true);
}
show_json($msg,$success);
}else{
if($success){
$href = './';
if(isset($this->in['link'])){
$href = rawurldecode($this->in['link']);
}
header('location:'.$href);
}else{
$this->login($msg);
}
}
exit;
}
//登陆token
private function _makeLoginToken($userInfo){
//$ua = $_SERVER['HTTP_USER_AGENT'];
$system_pass = $this->config['settingSystem']['systemPassword'];
return md5($userInfo['password'].$system_pass.$userInfo['userID']);
}
public function versionInstall(){
}
/**
* 修改密码
*/
public function changePassword(){
$passwordNow=rawurldecode($this->in['passwordNow']);
$passwordNew=rawurldecode($this->in['passwordNew']);
if (!$passwordNow && !$passwordNew)show_json(LNG('password_not_null'),false);
if ($this->user['password']==md5($passwordNow)){
$sql=systemMember::loadData();
$this->user['password'] = md5($passwordNew);
$sql->set($this->user['userID'],$this->user);
show_json('success');
}else {
show_json(LNG('old_password_error'),false);
}
}
//CSRF 防护;cookie设置:CSRF-TOKENheader:提交X-CSRF-TOKEN
//referer检测
private function _checkCSRF(){
$not_check = array('user.commonJs','pluginApp.index');
if( !$this->config['settingSystem']['csrfProtect'] ||
isset($this->in['accessToken']) ||
in_array(ST.'.'.ACT, $not_check)
){
return;
}
if( !isset($_SERVER['HTTP_X_CSRF_TOKEN'])||
$_SERVER['HTTP_X_CSRF_TOKEN'] != $_SESSION['X-CSRF-TOKEN']
){
show_json('token_error',false);
}
}
private function _checkKey($key){
if(!isset($this->in[$key])){
return '';
}
return is_string($this->in[$key])? rawurldecode($this->in[$key]):'';
}
private function initAuth(){
$auth = systemRole::getInfo($this->user['role']);
//向下版本兼容处理
//未定义;新版本首次使用默认开放的功能
if(!isset($auth['userShare.set'])){
$auth['userShare.set'] = 1;
}
if(!isset($auth['explorer.fileDownload'])){
$auth['explorer.fileDownload'] = 1;
}
//默认扩展功能 等价权限
$auth['user.commonJs'] = 1;//权限数据配置后输出到前端
$auth['explorer.pathDeleteRecycle'] = $auth['explorer.pathDelete'];
$auth['explorer.pathCopyDrag'] = $auth['explorer.pathCuteDrag'];
$auth['explorer.officeSave'] = $auth['editor.fileSave'];
$auth['explorer.fileSave'] = $auth['editor.fileSave'];
$auth['explorer.imageRotate'] = $auth['editor.fileSave'];
$auth['explorer.fileDownloadRemove']= $auth['explorer.fileDownload'];
$auth['explorer.zipDownload'] = $auth['explorer.fileDownload'];
$auth['explorer.unzipList'] = $auth['explorer.unzip'];
//彻底禁止下载;文件获取
//$auth['explorer.fileProxy'] = $auth['explorer.fileDownload'];
//$auth['editor.fileGet'] = $auth['explorer.fileDownload'];
//$auth['explorer.officeView'] = $auth['explorer.fileDownload'];
$auth['editor.fileGet'] = 1;
$auth['explorer.fileProxy'] = 1;
$auth['explorer.officeView']= 1;
$auth['explorer.pathList'] = 1;
$auth['explorer.treeList'] = 1;
if(!$auth['explorer.fileDownload']){
$auth['explorer.zip'] = 0;
}
$auth['userShare.del'] = $auth['userShare.set'];
$GLOBALS['auth'] = $auth;
}
/**
* 权限验证;统一入口检验
*/
public function authCheck(){
$this->initAuth();
if(in_array(ST,$this->notCheckST)) return;//不需要判断的控制器
if(in_array(ACT,$this->notCheckACT)) return;//不需要判断的action
if(in_array(ST.'.'.ACT,$this->notCheckApp)) return;//不需要判断的对应入口
if (!array_key_exists(ST,$this->config['roleSetting']) ) return;
if (!in_array(ACT,$this->config['roleSetting'][ST])) return;//输出处理过的权限
$this->_checkCSRF();
if (isset($GLOBALS['isRoot']) && $GLOBALS['isRoot'] == 1) return;
if ($GLOBALS['auth'][ST.'.'.ACT] != 1) show_json(LNG('no_permission'),false);
//扩展名限制:新建文件&上传文件&重命名文件&保存文件&zip解压文件
$check_arr = array(
'mkfile' => $this->_checkKey('path'),
'pathRname' => $this->_checkKey('rnameTo'),
'fileUpload'=> $_FILES['file']['name']? $_FILES['file']['name']:$GLOBALS['in']['name'],
'fileSave' => $this->_checkKey('path')
);
if (array_key_exists(ACT,$check_arr) && !checkExt($check_arr[ACT])){
show_json(LNG('no_permission_ext'),false);
}
}
public function checkCode() {
session_start();//re start
$captcha = new MyCaptcha(4);
$_SESSION['checkCode'] = $captcha->getString();
}
public function qrcode(){
$url = $this->in['url'];
if(function_exists('imagecolorallocate')){
ob_get_clean();
QRcode::png($this->in['url']);
}else{
header('location: https://demo.kodcloud.com/?user/view/qrcode&url='.rawurlencode($url));
}
}
}
@@ -0,0 +1,110 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
class userShare extends Controller{
private $sql;
function __construct(){
parent::__construct();
$this->sql=new FileCache(USER.'data/share.php');
}
/**
* 获取
*/
public function get($ret = 0) {
$list = $this->sql->get();
foreach($list as $key=>&$val){
//unset($val['sharePassword']);
}
if($ret){
return $list;
}
show_json($list, true);
}
//检测该目录是否已被共享
public function checkByPath(){
$this->in['path'] = _DIR_CLEAR($this->in['path']);
$shareInfo = $this->sql->get('path',$this->in['path']);
if (!$shareInfo) {
show_json('',false);//没有找到
}else{
show_json($shareInfo,true,$this->get(1));
}
}
/**
* 编辑
*/
public function set(){
if (!$this->in['name'] || !$this->in['path'] || !$this->in['type']){
show_json(LNG('data_not_full'),false);
}
$shareInfo = array(
'mtime' => time(),//更新则记录最后时间
'sid' => isset($this->in['sid'])?$this->in['sid']:'',
'type' => $this->in['type'],
'path' => _DIR_CLEAR($this->in['path']),
'name' => $this->in['name'],
'showName' => isset($this->in['showName'])?$this->in['showName']:$this->in['name'],
'timeTo' => isset($this->in['timeTo'])?$this->in['timeTo']:'',
'sharePassword' => isset($this->in['sharePassword'])?$this->in['sharePassword']:'',
'codeRead' => isset($this->in['codeRead'])?$this->in['codeRead']:'',
'canUpload' => isset($this->in['canUpload'])?$this->in['canUpload']:'',
'notDownload' => isset($this->in['notDownload'])?$this->in['notDownload']:''
);
if(substr($shareInfo['path'],0,1) == '{'){//用户只能分享自己的目录;
show_json(LNG('path_can_not_action'),false);
}
$name = $shareInfo['name'];
$search = $this->sql->get('name',$name);
$i = 0;
while($i>200 || $search && $search['sid']!=$shareInfo['sid']){
$name = $shareInfo['name'].'('.$i.')';
$search = $this->sql->get('name',$name);
$i++;
}
if($i !=0){
$shareInfo['name'] = $name;
}
//含有sid则为更新,否则为插入
if (isset($this->in['sid']) && strlen($this->in['sid']) == 8) {
$infoNew = $this->sql->get($this->in['sid']);
foreach ($shareInfo as $key=>$val) {//只更新指定key
$infoNew[$key] = $val;
}
if($this->sql->set($this->in['sid'],$infoNew)){
show_json($infoNew,true,$this->get(1));
}
show_json(LNG('error'),false);
}else{//插入
$shareList = $this->sql->get();
$newId = rand_string(8);
while (isset($shareList[$newId])) {
$newId = rand_string(8);
}
$shareInfo['sid'] = $newId;
if($this->sql->set($newId,$shareInfo)){
show_json($shareInfo,true,$this->get(1));
}
show_json(LNG('error'),false);
}
show_json(LNG('error'),false);
}
/**
* 删除
*/
public function del() {
$list = json_decode($this->in['dataArr'],true);
foreach ($list as $val) {
$this->sql->remove($val['path']);
}
show_json(LNG('success'),true,$this->get(1));
}
}
File diff suppressed because one or more lines are too long
+106
View File
@@ -0,0 +1,106 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
/**
* 程序路由处理类
* 这里类判断外界参数调用内部方法
*/
class Application {
private $defaultController = null; //默认的类名
private $defaultAction = null; //默认的方法名
public $subDir =''; //控制器子目录
public $model = ''; //控制器对应模型 对象。
/**
* 设置默认的类名
* @param string $defaultController
*/
public function setDefaultController($defaultController){
$this -> defaultController = $defaultController;
}
/**
* 设置默认的方法名
* @param string $defaultAction
*/
public function setDefaultAction($defaultAction){
$this -> defaultAction = $defaultAction;
}
/**
* 设置控制器子目录
* @param string $dir
*/
public function setSubDir($dir){
$this -> subDir = $dir;
}
/**
* 运行controller 的方法
* @param $class , controller类名。
* @param $function , 方法名
*/
public function appRun($className,$function){
$subDir = $this -> subDir ? $this -> subDir . '/' : '';
$classFile = CONTROLLER_DIR . $subDir.$className.'.class.php';
Hook::filter('Application.appRun',$classFile);
if (!file_exists_case($classFile)) {
show_tips($className.' controller '.LNG("not_exists"),APP_HOST,5);
}
include_once($classFile);
if (!class_exists($className)) {
show_tips($className.' class '.LNG("not_exists"),APP_HOST,5);
}
$instance = new $className();
if (!method_exists($instance, $function)) {
show_tips($function.' method '.LNG("not_exists"),APP_HOST,5);
}
return $instance -> $function();
}
/**
* 运行自动加载的控制器
*/
private function autorun(){
global $config;
if (count($config['autorun']) > 0) {
foreach ($config['autorun'] as $key => $var) {
$this->appRun($var['controller'],$var['function']);
}
}
}
/**
* 调用实际类和方式
*/
public function run(){
$URI = $GLOBALS['in']['URLremote'];
if (!isset($URI[0]) || $URI[0] == '') $URI[0] = $this->defaultController;
if (!isset($URI[1]) || $URI[1] == '') $URI[1] = $this->defaultAction;
//需要校验权限的方法,统一大小写敏感;处理需要权限的方法
$roleSetting = $GLOBALS['config']['roleSetting'];
$st = $URI[0];
$act = $URI[1];
if (array_key_exists($st,$roleSetting) ){
if( !in_array($act,$roleSetting[$st]) &&
in_array_not_case($act,$roleSetting[$st])
){
show_tips($act.' action not exists!');
}
}
define('ST',$st);
define('ACT',$act);
//自动加载运行类。
$this->autorun();
$this->appRun(ST,ACT);
}
}
+74
View File
@@ -0,0 +1,74 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
/**
* 控制器抽象类
*/
abstract class Controller {
public $in;
public $config; // 全局配置
public $tpl; // 模板目录
public $values; // 模板变量
/**
* 构造函数
*/
function __construct(){
global $in,$config;
$this ->config = &$config;
$this ->in = &$in;
$this ->values['config'] = &$config;
$this ->values['in'] = &$in;
$this ->tpl = TEMPLATE.get_class($this).'/';
}
/**
* 加载模型
* @param string $class
*/
public function loadModel($class){
$args = func_get_args();
$this -> $class = call_user_func_array('init_model', $args);
return $this -> $class;
}
/**
* 加载类库文件
* @param string $class
*/
public function loadClass($class){
if (1 === func_num_args()) {
$this -> $class = new $class;
} else {
$reflectionObj = new ReflectionClass($class);
$args = func_get_args();
array_shift($args);
$this -> $class = $reflectionObj -> newInstanceArgs($args);
}
return $this -> $class;
}
/**
* 显示模板
*
* TODO smarty
* @param
*/
protected function assign($key,$value){
$this->values[$key] = $value;
}
/**
* 显示模板
* @param
*/
protected function display($tplFile){
ob_end_clean();
extract($this->values);
require($this->tpl.$tplFile);
}
}
+38
View File
@@ -0,0 +1,38 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
/**
* 模型抽象类
* 一个关于各种模型的基本行为类,每个模型都必须继承这个类的方法
*/
abstract class Model {
var $db = null;
var $in;
var $config;
/**
* 构造函数
* @return Null
*/
function __construct(){
global $config, $in;
$this -> in = &$in;
$this -> config = &$config;
}
/**
* TODO db
*/
function db(){
if ($this ->db != NULL) {
return $this ->db;
}else{
}
}
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,534 @@
<?php
//扩展名权限判断 有权限则返回1 不是true
function checkExt($file){
if($GLOBALS['isRoot']) return 1;
if($file == '.htaccess' || $file == '.user.ini') return false;
if (strstr($file,'<') || strstr($file,'>') || $file=='') {
return 0;
}
//'php|phtml|phtm|pwml|asp|aspx|ascx|jsp|pl|htaccess|shtml|shtm'
$notAllow = strtolower($GLOBALS['auth']['extNotAllow']);
$extArr = explode('|',$notAllow);
if(in_array('asp',$extArr)){
$extArr = array_merge($extArr,array('aspx','ascx','pwml'));
}
if(in_array('php',$extArr)){
$extArr = array_merge($extArr,array('phtml','phtm','htaccess','pwml'));
}
if(in_array('htm',$extArr) || in_array('html',$extArr)){
$extArr = array_merge($extArr,array('html','shtml','shtm','html','svg'));
}
foreach ($extArr as $current) {
if ($current !== '' && stristr($file,'.'.$current)){//含有扩展名
return 0;
}
}
return 1;
}
function checkExtSafe($file){
if($file == '.htaccess' || $file == '.user.ini') return false;
if (strstr($file,'<') || strstr($file,'>') || $file=='') return false;
$disable = 'php|phtml|phtm|pwml|asp|aspx|ascx|jsp|pl|html|htm|svg|shtml|shtm';
$extArr = explode('|',$disable);
foreach ($extArr as $ext) {
if ($ext && stristr($file,'.'.$ext)) return false;
}
return true;
}
//-----解压缩跨平台编码转换;自动识别编码-----
//压缩前,文件名处理;
//ACT=zip——压缩到当前
//ACT=zipDownload---打包下载[判断浏览器&UA——得到地区自动转换为目标编码];
function zip_pre_name($fileName,$toCharset=false){
if(get_path_this($fileName) == '.DS_Store') return '';//过滤文件
if (!function_exists('iconv')){
return $fileName;
}
$charset = $GLOBALS['config']['systemCharset'];
if($toCharset == false){//默认从客户端和浏览器自动识别
$toCharset = 'utf-8';
$clientLanugage = I18n::defaultLang();
$langType = I18n::getType();
if( client_is_windows() && (
$clientLanugage =='zh-CN' ||
$clientLanugage =='zh-TW' ||
$langType =='zh-CN' ||
$langType =='zh-TW' )
){
$toCharset = "gbk";//压缩或者打包下载压缩时文件名采用的编码
}
}
$result = iconv_to($fileName,$charset,$toCharset);
if(!$result){
$result = $fileName;
}
//write_log("zip:".$charset.'=>'.$toCharset.';'.$fileName.'=>'.$result,'zip');
return $result;
}
function unzip_filter_ext($name){
$add = '.txt';
if( checkExt($name) &&
!stristr($name,'user.ini') &&
!stristr($name,'.htaccess')
){//允许
return $name;
}
return $name.$add;
}
//解压到kod,文件名处理;识别编码并转换到当前系统编码
function unzip_pre_name($fileName){
$fileName = str_replace(array('../','..\\',''),'',$fileName);
if (!function_exists('iconv')){
return unzip_filter_ext($fileName);
}
if(isset($GLOBALS['unzipFileCharsetGet'])){
$charset = $GLOBALS['unzipFileCharsetGet'];
}else{
$charset = get_charset($fileName);
}
$toCharset = $GLOBALS['config']['systemCharset'];
$result = iconv_to($fileName,$charset,$toCharset);
if(!$result){
$result = $fileName;
}
$result = unzip_filter_ext($result);
//echo $charset.'==>'.$toCharset.':'.$result.'==='.$fileName.'<br/>';
return $result;
}
// 获取压缩文件内编码
// $GLOBALS['unzipFileCharsetGet']
function unzip_charset_get($list){
if(count($list) == 0) return 'utf-8';
$charsetArr = array();
for ($i=0; $i < count($list); $i++) {
$charset = get_charset($list[$i]['filename']);
if(!isset($charsetArr[$charset])){
$charsetArr[$charset] = 1;
}else{
$charsetArr[$charset] += 1;
}
}
arsort($charsetArr);
$keys = array_keys($charsetArr);
if(in_array('gbk',$keys)){//含有gbk,则认为是gbk
$keys[0] = 'gbk';
}
$GLOBALS['unzipFileCharsetGet'] = $keys[0];
return $keys[0];
}
/**
* 服务器相关环境
* 检测环境是否支持升级版本
*/
function serverInfo(){
$lib = array(
"sqlit3"=>intval( class_exists('SQLite3') ),
"sqlit" =>intval( extension_loaded('sqlite') ),
"curl" =>intval( function_exists('curl_init') ),
"pdo" =>intval( class_exists('PDO') ),
"mysqli"=>intval( extension_loaded('mysqli') ),
"mysql" =>intval( extension_loaded('mysql') ),
);
$libStr = "";
foreach($lib as $key=>$val){
$libStr .= $key.'='.$val.';';
}
$system = explode(" ", php_uname());
$env = array(
"sys" => strtolower($system[0]),
"php" => floatval(PHP_VERSION),
"server"=> $_SERVER['SERVER_SOFTWARE'],
"lib" => $libStr,
"info" => php_uname().';php='.PHP_VERSION,
);
$result = str_replace("\/","@",json_encode($env));
return $result;
}
function charset_check(&$str,$check,$tempCharset='utf-8'){
if ($str === '' || !function_exists("mb_convert_encoding")){
return false;
}
$testStr1 = @mb_convert_encoding($str,$tempCharset,$check);
$testStr2 = @mb_convert_encoding($testStr1,$check,$tempCharset);
if($str == $testStr2){
return true;
}
return false;
}
//https://segmentfault.com/a/1190000003020776
//http://blog.sina.com.cn/s/blog_b97feef301019571.html
function get_charset(&$str) {
if($GLOBALS['config']['checkCharsetDefault']){//直接指定编码
return $GLOBALS['config']['checkCharsetDefault'];
}
if ($str === '' || !function_exists("mb_detect_encoding")){
return 'utf-8';
}
$bom_arr = array(
'utf-8' => chr(0xEF) . chr(0xBB) .chr(0xBF),
'utf-16le' => chr(0xFF) . chr(0xFE),
'utf-16be' => chr(0xFE) . chr(0xFF),
'utf-32le' => chr(0xFF) . chr(0xFE) . chr(0x00) . chr(0x00),
'utf-32be' => chr(0x00) . chr(0x00) . chr(0xFE) . chr(0xFF),
);
foreach ($bom_arr as $key => $value) {
if (substr($str,0,strlen($value)) === $value ){
return $key;
}
}
//前面检测成功则,自动忽略后面
$charset=strtolower(@mb_detect_encoding($str,$GLOBALS['config']['checkCharset']));
$charsetGet = $charset;
if ($charset == 'cp936'){
// 有交叉,部分文件无法识别
if(charset_check($str,'ISO-8859-4') && !charset_check($str,'gbk') && !charset_check($str,'big5')){
$charset = 'ISO-8859-4';
}elseif(charset_check($str,'gbk') && !charset_check($str,'big5')){
$charset = 'gbk';
}else if(charset_check($str,'big5')){
$charset = 'big5';
}
}else if ($charset == 'euc-cn'){
$charset = 'gbk';
}else if ($charset == 'ascii'){
$charset = 'utf-8';
}
if ($charset == 'iso-8859-1'){
//检测详细编码;value为用什么编码检测;为空则用utf-8
$check = array(
'utf-8' => $charset,
'utf-16' => 'gbk',
'cp1251' => 'utf-8',
'cp1252' => 'utf-8'
);
foreach($check as $key => $val){
if(charset_check($str,$key,$val)){
if($val == ''){
$val = 'utf-8';
}
$charset = $key;
break;
}
}
}
//show_json($charset,false,$charsetGet);
return $charset;
}
function file_upload_size(){
global $config;
$size = get_post_max();
if(isset($config['settings']['updloadChunkSize'])){
$chunk = $config['settings']['updloadChunkSize'];
if($size >= $chunk){
$size = $chunk;
}
}
return $size;
}
function check_list_dir(){
$url = APP_HOST.'app/core/';
$find = "Application.class.php";
@ini_set('default_socket_timeout',1);
$context = stream_context_create(array('http'=>array('method'=>"GET",'timeout'=>1)));
$str = @file_get_contents($url,false,$context);
if(stripos($str,$find) === false){//not find;ok success
return true;
}else{
return false;
}
}
function php_env_check(){
$error = '';
if(!function_exists('iconv')) $error.= '<li>'.LNG('php_env_error').' iconv</li>';
if(!function_exists('json_encode')) $error.= '<li>'.LNG('php_env_error').' json</li>';
if(!function_exists('curl_init')) $error.= '<li>'.LNG('php_env_error').' curl</li>';
if(!function_exists('mb_convert_encoding')) $error.= '<li>'.LNG('php_env_error').' mb_string</li>';
if(!function_exists('file_get_contents')) $error.='<li>'.LNG('php_env_error').' file_get_contents</li>';
if(!version_compare(PHP_VERSION,'5.0','>=')) $error.= '<li>'.LNG('php_env_error_version').'</li>';
if(!check_list_dir()) $error.='<li>'.LNG('php_env_error_list_dir').'</li>';
$parent = get_path_father(BASIC_PATH);
$arr_check = array(
BASIC_PATH,
DATA_PATH,
DATA_PATH.'system',
DATA_PATH.'User',
DATA_PATH.'Group',
DATA_PATH.'session'
);
foreach ($arr_check as $value) {
if(!path_writeable($value)){
$error.= '<li>'.str_replace($parent,'',$value).'/ '.LNG('php_env_error_path').'</li>';
}
}
if( !function_exists('imagecreatefromjpeg')||
!function_exists('imagecreatefromgif')||
!function_exists('imagecreatefrompng')||
!function_exists('imagecolorallocate')){
$error.= '<li>'.LNG('php_env_error_gd').'</li>';
}
return $error;
}
//提前判断版本是否一致;
function check_cache(){
//检查是否更新失效
$content = file_get_contents(BASIC_PATH.'config/version.php');
$result = match_text($content,"'KOD_VERSION','(.*)'");
if($result != KOD_VERSION){
show_tips("您服务器开启了php缓存,文件更新尚未生效;
请关闭缓存,或稍后1分钟刷新页面再试!
<a href='http://www.tuicool.com/articles/QVjeu2i' target='_blank'>了解详情</a>");
}
}
function init_common(){
$GLOBALS['in'] = parse_incoming();
if(!file_exists(DATA_PATH)){
show_tips("data 目录不存在!\n\n(检查 DATA_PATH);");
}
// session path create and check
$errorTips = "[Error Code:1002] 目录权限错误!请设置程序目录及所有子目录为读写状态,
linux 运行如下指令:
<pre>su -c 'setenforce 0'\nchmod -R 777 ".BASIC_PATH.'</pre>';
if( !defined('SESSION_PATH_DEFAULT') ){
//检查session是否存在
if( !file_exists(KOD_SESSION) ||
!file_exists(KOD_SESSION.'index.html')){
mk_dir(KOD_SESSION);
touch(KOD_SESSION.'index.html');
if(!file_exists(KOD_SESSION.'index.html') ){
show_tips($errorTips);
}
}
//检查目录权限
if( !is_writable(KOD_SESSION) ||
!is_writable(KOD_SESSION.'index.html') ||
!is_writable(DATA_PATH.'system/apps.php') ||
!is_writable(DATA_PATH)){
show_tips($errorTips);
}
}
//version check update
$file = LIB_DIR.'update.php';
if(file_exists($file)){
//覆盖安装文件删除不了重定向问题优化
if(!is_writable($file) ){
show_tips($errorTips);
}
//update;
include($file);
updateCheck($file);
//clear
del_file($file);
if(file_exists($file)){
show_tips($errorTips);
}
user_logout();
}
}
//登陆是否需要验证码
function need_check_code(){
$setting = $GLOBALS['config']['settingSystem'];
if( !$setting['needCheckCode'] ||
!function_exists('imagecreatefromjpeg')||
!function_exists('imagecreatefromgif')||
!function_exists('imagecreatefrompng')||
!function_exists('imagecolorallocate')
){
return false;
}else{
return true;
}
}
function make_path($str){
//return md5(rand_string(30).$str.time());
$replace = array('/','\\',':','*','?','"','<','>','|');
return str_replace($replace, "_", $str);
}
function init_setting(){
$settingFile = USER_SYSTEM.'system_setting.php';
$settingSystemDefault = $GLOBALS['config']['settingSystemDefault'];
if (!file_exists($settingFile)){
$setting = $settingSystemDefault;
FileCache::save($settingFile,$setting);
}else{
$setting = FileCache::load($settingFile);
}
//合并配置
foreach ($settingSystemDefault as $key => $value) {
if(!isset($setting[$key])){
$setting[$key] = $value;
}
}
$GLOBALS['app']->setDefaultController($setting['firstIn']);
$GLOBALS['app']->setDefaultAction('index');
$GLOBALS['config']['settingSystem'] = $setting;
//group_role
$roleGroupFile = USER_SYSTEM.'system_role_group.php';
$roleGroup = $GLOBALS['config']['pathRoleGroupDefault'];
if (!file_exists($roleGroupFile)){
FileCache::save($roleGroupFile,$roleGroup);
}else{
$roleGroup = FileCache::load($roleGroupFile);
}
$GLOBALS['config']['pathRoleGroup'] = $roleGroup;
if(is_array($GLOBALS['L'])){
I18n::set($GLOBALS['L']);
}
I18n::set(array(
'kod_name' => $GLOBALS['config']['settingSystem']['systemName'],
'kod_name_desc' => $GLOBALS['config']['settingSystem']['systemDesc'],
));
if(isset($GLOBALS['config']['setting_system']['system_name'])){
I18n::set(array(
'kod_name' => $GLOBALS['config']['setting_system']['system_name'],
'kod_name_desc' => $GLOBALS['config']['setting_system']['system_desc'],
));
}
define('STATIC_PATH',$GLOBALS['config']['settings']['staticPath']);
}
function user_logout(){
@session_destroy();
@session_name('KOD_SESSION_SSO');
@session_start();
@session_destroy();
setcookie(SESSION_ID, '', time()-3600,'/');
setcookie('kod_name', '', time()-3600);
setcookie('kodToken', '', time()-3600);
setcookie('X-CSRF-TOKEN','',time()-3600);
$url = './index.php?user/login';
//之前界面维持,不是主动退出则登陆后跳转到之前页面
if(defined('ACT') && ACT != 'logout' && count($_GET)!=0 ){
$url .= '&link='.rawurlencode(this_url());
}
//移动端;接口请求时退出
if(isset($_REQUEST['HTTP_X_PLATFORM'])){
show_json('login error!',10001);
}
header('Location:'.$url);
exit;
}
function hash_encode($str) {
return str_replace(
base64_encode($str),
array('+','/','='),
array('_a','_b','_c')
);
}
function hash_decode($str) {
return base64_decode(
str_replace($str,array('_a','_b','_c'),array('+','/','='))
);
}
// 目录hash;
function hash_path($path,$addExt=false){
$password = 'kodcloud';
if(isset($GLOBALS['config']['settingSystem']['systemPassword'])){
$password = $GLOBALS['config']['settingSystem']['systemPassword'];
}
$pre = substr(md5($path.$password),0,8);
$result = $pre.md5($path);
if(file_exists($path)){
$result = $pre.md5($path.filemtime($path));
if(filesize($path) < 50*1024*1024){
$fileMd5 = @md5_file($path);
if($fileMd5){
$result = $fileMd5;
}
}
}
if($addExt){
$result = $result.'.'.get_path_ext($path);
}
return $result;
}
function navbar_menu_add($array){
$menu = &$GLOBALS['config']['settingSystem']['menu'];
$exist = false;
foreach ($menu as $value) {
if($value['name'] == $array['name']){
return false;
}
}
$menu[] = $array;
}
/**
* 检测用户是否在用户选择数据中
* @param [type] $info 组合数据 "all:0;role:1;2;user:2;group:101,102;"
* @return [type] [description]
*/
function check_user_select($info){
if(!is_string($info) || !$info) return true;
$valueArr = array(
"all" => "0",
"user" => array(),
"group" => array(),
"role" => array()
);
$userTypeArr = explode(';',$info);
for($i = 0;$i< count($userTypeArr);$i++){
$splitArr = explode(':',$userTypeArr[$i]);
if(count($splitArr) == 2){
$valueArr[$splitArr[0]] = $splitArr[1];
if($splitArr[0] != 'all'){
$valueArr[$splitArr[0]] = explode(',',$splitArr[1]);
}
}
}
if(!$valueArr['user'] && !$valueArr['group'] && !$valueArr['role']){
$valueArr['all'] = '1';
}
if($valueArr['all'] == '1'){
return true;
}
$userInfo = $_SESSION['kodUser'];
if(!$userInfo){
return false;
}
if( $valueArr['all'] == '1' ||
in_array($userInfo['userID'],$valueArr['user']) ||
in_array($userInfo['role'],$valueArr['role']) ){
return true;
}
$groupArr = array_keys($userInfo['groupInfo']);
foreach ($groupArr as $id) {
if( in_array($id,$valueArr['group']) ){
return true;
}
}
return false;
}
+788
View File
@@ -0,0 +1,788 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Converts to and from JSON format.
*
* JSON (JavaScript Object Notation) is a lightweight data-interchange
* format. It is easy for humans to read and write. It is easy for machines
* to parse and generate. It is based on a subset of the JavaScript
* Programming Language, Standard ECMA-262 3rd Edition - December 1999.
* This feature can also be found in Python. JSON is a text format that is
* completely language independent but uses conventions that are familiar
* to programmers of the C-family of languages, including C, C++, C#, Java,
* JavaScript, Perl, TCL, and many others. These properties make JSON an
* ideal data-interchange language.
*
* This package provides a simple encoder and decoder for JSON notation. It
* is intended for use with client-side Javascript applications that make
* use of HTTPRequest to perform server communication functions - data can
* be encoded into JSON notation for use in a client-side javascript, or
* decoded from incoming Javascript requests. JSON format is native to
* Javascript, and can be directly eval()'ed with no further parsing
* overhead
*
* All strings should be in ASCII or UTF-8 format!
*
* LICENSE: Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met: Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following
* disclaimer. Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
* NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* @category
* @package Services_JSON
* @author Michal Migurski <mike-json@teczno.com>
* @author Matt Knapp <mdknapp[at]gmail[dot]com>
* @author Brett Stimmerman <brettstimmerman[at]gmail[dot]com>
* @copyright 2005 Michal Migurski
* @version CVS: $Id: JSON.php,v 1.31 2006/06/28 05:54:17 migurski Exp $
* @license http://www.opensource.org/licenses/bsd-license.php
* @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198
*/
/**
* Marker constant for Services_JSON::decode(), used to flag stack state
*/
define('SERVICES_JSON_SLICE', 1);
/**
* Marker constant for Services_JSON::decode(), used to flag stack state
*/
define('SERVICES_JSON_IN_STR', 2);
/**
* Marker constant for Services_JSON::decode(), used to flag stack state
*/
define('SERVICES_JSON_IN_ARR', 3);
/**
* Marker constant for Services_JSON::decode(), used to flag stack state
*/
define('SERVICES_JSON_IN_OBJ', 4);
/**
* Marker constant for Services_JSON::decode(), used to flag stack state
*/
define('SERVICES_JSON_IN_CMT', 5);
/**
* Behavior switch for Services_JSON::decode()
*/
define('SERVICES_JSON_LOOSE_TYPE', 16);
/**
* Behavior switch for Services_JSON::decode()
*/
define('SERVICES_JSON_SUPPRESS_ERRORS', 32);
/**
* Converts to and from JSON format.
*
* Brief example of use:
*
* <code>
* // create a new instance of Services_JSON
* $json = new Services_JSON();
*
* // convert a complexe value to JSON notation, and send it to the browser
* $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4)));
* $output = $json->encode($value);
*
* print($output);
* // prints: ["foo","bar",[1,2,"baz"],[3,[4]]]
*
* // accept incoming POST data, assumed to be in JSON notation
* $input = file_get_contents('php://input', 1000000);
* $value = $json->decode($input);
* </code>
*/
class Services_JSON
{
/**
* constructs a new JSON instance
*
* @param int $use object behavior flags; combine with boolean-OR
*
* possible values:
* - SERVICES_JSON_LOOSE_TYPE: loose typing.
* "{...}" syntax creates associative arrays
* instead of objects in decode().
* - SERVICES_JSON_SUPPRESS_ERRORS: error suppression.
* Values which can't be encoded (e.g. resources)
* appear as NULL instead of throwing errors.
* By default, a deeply-nested resource will
* bubble up with an error, so all return values
* from encode() should be checked with isError()
*/
function __construct($use = 0)
{
$this->use = $use;
}
/**
* convert a string from one UTF-16 char to one UTF-8 char
*
* Normally should be handled by mb_convert_encoding, but
* provides a slower PHP-only method for installations
* that lack the multibye string extension.
*
* @param string $utf16 UTF-16 character
* @return string UTF-8 character
* @access private
*/
function utf162utf8($utf16)
{
// oh please oh please oh please oh please oh please
if(function_exists('mb_convert_encoding')) {
return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');
}
$bytes = (ord($utf16[0]) << 8) | ord($utf16[1]);
switch(true) {
case ((0x7F & $bytes) == $bytes):
// this case should never be reached, because we are in ASCII range
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
return chr(0x7F & $bytes);
case (0x07FF & $bytes) == $bytes:
// return a 2-byte UTF-8 character
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
return chr(0xC0 | (($bytes >> 6) & 0x1F))
. chr(0x80 | ($bytes & 0x3F));
case (0xFFFF & $bytes) == $bytes:
// return a 3-byte UTF-8 character
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
return chr(0xE0 | (($bytes >> 12) & 0x0F))
. chr(0x80 | (($bytes >> 6) & 0x3F))
. chr(0x80 | ($bytes & 0x3F));
}
// ignoring UTF-32 for now, sorry
return '';
}
/**
* convert a string from one UTF-8 char to one UTF-16 char
*
* Normally should be handled by mb_convert_encoding, but
* provides a slower PHP-only method for installations
* that lack the multibye string extension.
*
* @param string $utf8 UTF-8 character
* @return string UTF-16 character
* @access private
*/
function utf82utf16($utf8)
{
// oh please oh please oh please oh please oh please
if(function_exists('mb_convert_encoding')) {
return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
}
switch(strlen($utf8)) {
case 1:
// this case should never be reached, because we are in ASCII range
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
return $utf8;
case 2:
// return a UTF-16 character from a 2-byte UTF-8 char
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
return chr(0x07 & (ord($utf8[0]) >> 2))
. chr((0xC0 & (ord($utf8[0]) << 6))
| (0x3F & ord($utf8[1])));
case 3:
// return a UTF-16 character from a 3-byte UTF-8 char
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
return chr((0xF0 & (ord($utf8[0]) << 4))
| (0x0F & (ord($utf8[1]) >> 2)))
. chr((0xC0 & (ord($utf8[1]) << 6))
| (0x7F & ord($utf8[2])));
}
// ignoring UTF-32 for now, sorry
return '';
}
/**
* encodes an arbitrary variable into JSON format
*
* @param mixed $var any number, boolean, string, array, or object to be encoded.
* see argument 1 to Services_JSON() above for array-parsing behavior.
* if var is a strng, note that encode() always expects it
* to be in ASCII or UTF-8 format!
*
* @return mixed JSON string representation of input var or an error if a problem occurs
* @access public
*/
function encode($var)
{
switch (gettype($var)) {
case 'boolean':
return $var ? 'true' : 'false';
case 'NULL':
return 'null';
case 'integer':
return (int) $var;
case 'double':
case 'float':
return (float) $var;
case 'string':
// STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
$ascii = '';
$strlen_var = strlen($var);
/*
* Iterate over every character in the string,
* escaping with a slash or encoding to UTF-8 where necessary
*/
for ($c = 0; $c < $strlen_var; ++$c) {
$ord_var_c = ord($var{$c});
switch (true) {
case $ord_var_c == 0x08:
$ascii .= '\b';
break;
case $ord_var_c == 0x09:
$ascii .= '\t';
break;
case $ord_var_c == 0x0A:
$ascii .= '\n';
break;
case $ord_var_c == 0x0C:
$ascii .= '\f';
break;
case $ord_var_c == 0x0D:
$ascii .= '\r';
break;
case $ord_var_c == 0x22:
case $ord_var_c == 0x2F:
case $ord_var_c == 0x5C:
// double quote, slash, slosh
$ascii .= '\\'.$var{$c};
break;
case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
// characters U-00000000 - U-0000007F (same as ASCII)
$ascii .= $var{$c};
break;
case (($ord_var_c & 0xE0) == 0xC0):
// characters U-00000080 - U-000007FF, mask 110XXXXX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char = pack('C*', $ord_var_c, ord($var{$c + 1}));
$c += 1;
$utf16 = $this->utf82utf16($char);
$ascii .= sprintf('\u%04s', bin2hex($utf16));
break;
case (($ord_var_c & 0xF0) == 0xE0):
// characters U-00000800 - U-0000FFFF, mask 1110XXXX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char = pack('C*', $ord_var_c,
ord($var{$c + 1}),
ord($var{$c + 2}));
$c += 2;
$utf16 = $this->utf82utf16($char);
$ascii .= sprintf('\u%04s', bin2hex($utf16));
break;
case (($ord_var_c & 0xF8) == 0xF0):
// characters U-00010000 - U-001FFFFF, mask 11110XXX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char = pack('C*', $ord_var_c,
ord($var{$c + 1}),
ord($var{$c + 2}),
ord($var{$c + 3}));
$c += 3;
$utf16 = $this->utf82utf16($char);
$ascii .= sprintf('\u%04s', bin2hex($utf16));
break;
case (($ord_var_c & 0xFC) == 0xF8):
// characters U-00200000 - U-03FFFFFF, mask 111110XX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char = pack('C*', $ord_var_c,
ord($var{$c + 1}),
ord($var{$c + 2}),
ord($var{$c + 3}),
ord($var{$c + 4}));
$c += 4;
$utf16 = $this->utf82utf16($char);
$ascii .= sprintf('\u%04s', bin2hex($utf16));
break;
case (($ord_var_c & 0xFE) == 0xFC):
// characters U-04000000 - U-7FFFFFFF, mask 1111110X
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char = pack('C*', $ord_var_c,
ord($var{$c + 1}),
ord($var{$c + 2}),
ord($var{$c + 3}),
ord($var{$c + 4}),
ord($var{$c + 5}));
$c += 5;
$utf16 = $this->utf82utf16($char);
$ascii .= sprintf('\u%04s', bin2hex($utf16));
break;
}
}
return '"'.$ascii.'"';
case 'array':
/*
* As per JSON spec if any array key is not an integer
* we must treat the the whole array as an object. We
* also try to catch a sparsely populated associative
* array with numeric keys here because some JS engines
* will create an array with empty indexes up to
* max_index which can cause memory issues and because
* the keys, which may be relevant, will be remapped
* otherwise.
*
* As per the ECMA and JSON specification an object may
* have any string as a property. Unfortunately due to
* a hole in the ECMA specification if the key is a
* ECMA reserved word or starts with a digit the
* parameter is only accessible using ECMAScript's
* bracket notation.
*/
// treat as a JSON object
if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {
$properties = array_map(array($this, 'name_value'),
array_keys($var),
array_values($var));
foreach($properties as $property) {
if(Services_JSON::isError($property)) {
return $property;
}
}
return '{' . join(',', $properties) . '}';
}
// treat it like a regular array
$elements = array_map(array($this, 'encode'), $var);
foreach($elements as $element) {
if(Services_JSON::isError($element)) {
return $element;
}
}
return '[' . join(',', $elements) . ']';
case 'object':
$vars = get_object_vars($var);
$properties = array_map(array($this, 'name_value'),
array_keys($vars),
array_values($vars));
foreach($properties as $property) {
if(Services_JSON::isError($property)) {
return $property;
}
}
return '{' . join(',', $properties) . '}';
default:
return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS)
? 'null'
: new Services_JSON_Error(gettype($var)." can not be encoded as JSON string");
}
}
/**
* array-walking function for use in generating JSON-formatted name-value pairs
*
* @param string $name name of key to use
* @param mixed $value reference to an array element to be encoded
*
* @return string JSON-formatted name-value pair, like '"name":value'
* @access private
*/
function name_value($name, $value)
{
$encoded_value = $this->encode($value);
if(Services_JSON::isError($encoded_value)) {
return $encoded_value;
}
return $this->encode(strval($name)) . ':' . $encoded_value;
}
/**
* reduce a string by removing leading and trailing comments and whitespace
*
* @param $str string string value to strip of comments and whitespace
*
* @return string string value stripped of comments and whitespace
* @access private
*/
function reduce_string($str){
$str = preg_replace(array(
// eliminate single line comments in '// ...' form
'#^\s*//(.+)$#m',
// eliminate multi-line comments in '/* ... */' form, at start of string
'#^\s*/\*(.+)\*/#Us',
// eliminate multi-line comments in '/* ... */' form, at end of string
'#/\*(.+)\*/\s*$#Us'
), '', $str);
// eliminate extraneous space
return trim($str);
}
/**
* decodes a JSON string into appropriate variable
*
* @param string $str JSON-formatted string
*
* @return mixed number, boolean, string, array, or object
* corresponding to given JSON input string.
* See argument 1 to Services_JSON() above for object-output behavior.
* Note that decode() always returns strings
* in ASCII or UTF-8 format!
* @access public
*/
function decode($str)
{
$str = $this->reduce_string($str);
switch (strtolower($str)) {
case 'true':
return true;
case 'false':
return false;
case 'null':
return null;
default:
$m = array();
if (is_numeric($str)) {
// Lookie-loo, it's a number
// This would work on its own, but I'm trying to be
// good about returning integers where appropriate:
// return (float)$str;
// Return float or int, as appropriate
return ((float)$str == (integer)$str)
? (integer)$str
: (float)$str;
} elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) {
// STRINGS RETURNED IN UTF-8 FORMAT
$delim = substr($str, 0, 1);
$chrs = substr($str, 1, -1);
$utf8 = '';
$strlen_chrs = strlen($chrs);
for ($c = 0; $c < $strlen_chrs; ++$c) {
$substr_chrs_c_2 = substr($chrs, $c, 2);
$ord_chrs_c = ord($chrs{$c});
switch (true) {
case $substr_chrs_c_2 == '\b':
$utf8 .= chr(0x08);
++$c;
break;
case $substr_chrs_c_2 == '\t':
$utf8 .= chr(0x09);
++$c;
break;
case $substr_chrs_c_2 == '\n':
$utf8 .= chr(0x0A);
++$c;
break;
case $substr_chrs_c_2 == '\f':
$utf8 .= chr(0x0C);
++$c;
break;
case $substr_chrs_c_2 == '\r':
$utf8 .= chr(0x0D);
++$c;
break;
case $substr_chrs_c_2 == '\\"':
case $substr_chrs_c_2 == '\\\'':
case $substr_chrs_c_2 == '\\\\':
case $substr_chrs_c_2 == '\\/':
if (($delim == '"' && $substr_chrs_c_2 != '\\\'') ||
($delim == "'" && $substr_chrs_c_2 != '\\"')) {
$utf8 .= $chrs{++$c};
}
break;
case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)):
// single, escaped unicode character
$utf16 = chr(hexdec(substr($chrs, ($c + 2), 2)))
. chr(hexdec(substr($chrs, ($c + 4), 2)));
$utf8 .= $this->utf162utf8($utf16);
$c += 5;
break;
case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F):
$utf8 .= $chrs{$c};
break;
case ($ord_chrs_c & 0xE0) == 0xC0:
// characters U-00000080 - U-000007FF, mask 110XXXXX
//see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$utf8 .= substr($chrs, $c, 2);
++$c;
break;
case ($ord_chrs_c & 0xF0) == 0xE0:
// characters U-00000800 - U-0000FFFF, mask 1110XXXX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$utf8 .= substr($chrs, $c, 3);
$c += 2;
break;
case ($ord_chrs_c & 0xF8) == 0xF0:
// characters U-00010000 - U-001FFFFF, mask 11110XXX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$utf8 .= substr($chrs, $c, 4);
$c += 3;
break;
case ($ord_chrs_c & 0xFC) == 0xF8:
// characters U-00200000 - U-03FFFFFF, mask 111110XX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$utf8 .= substr($chrs, $c, 5);
$c += 4;
break;
case ($ord_chrs_c & 0xFE) == 0xFC:
// characters U-04000000 - U-7FFFFFFF, mask 1111110X
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$utf8 .= substr($chrs, $c, 6);
$c += 5;
break;
}
}
return $utf8;
} elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) {
// array, or object notation
if ($str[0]== '[') {
$stk = array(SERVICES_JSON_IN_ARR);
$arr = array();
} else {
if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
$stk = array(SERVICES_JSON_IN_OBJ);
$obj = array();
} else {
$stk = array(SERVICES_JSON_IN_OBJ);
$obj = new stdClass();
}
}
array_push($stk, array('what' => SERVICES_JSON_SLICE,
'where' => 0,
'delim' => false));
$chrs = substr($str, 1, -1);
$chrs = $this->reduce_string($chrs);
if ($chrs == '') {
if (reset($stk) == SERVICES_JSON_IN_ARR) {
return $arr;
} else {
return $obj;
}
}
//print("\nparsing {$chrs}\n");
$strlen_chrs = strlen($chrs);
for ($c = 0; $c <= $strlen_chrs; ++$c) {
$top = end($stk);
$substr_chrs_c_2 = substr($chrs, $c, 2);
if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) {
// found a comma that is not inside a string, array, etc.,
// OR we've reached the end of the character list
$slice = substr($chrs, $top['where'], ($c - $top['where']));
array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false));
//print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
if (reset($stk) == SERVICES_JSON_IN_ARR) {
// we are in an array, so just push an element onto the stack
array_push($arr, $this->decode($slice));
} elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
// we are in an object, so figure
// out the property name and set an
// element in an associative array,
// for now
$parts = array();
if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
// "name":value pair
$key = $this->decode($parts[1]);
$val = $this->decode($parts[2]);
if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
$obj[$key] = $val;
} else {
$obj->$key = $val;
}
} elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
// name:value pair, where name is unquoted
$key = $parts[1];
$val = $this->decode($parts[2]);
if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
$obj[$key] = $val;
} else {
$obj->$key = $val;
}
}
}
} elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) {
// found a quote, and we are not inside a string
array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c}));
//print("Found start of string at {$c}\n");
} elseif (($chrs{$c} == $top['delim']) &&
($top['what'] == SERVICES_JSON_IN_STR) &&
((strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($chrs, 0, $c), '\\'))) % 2 != 1)) {
// found a quote, we're in a string, and it's not escaped
// we know that it's not escaped becase there is _not_ an
// odd number of backslashes at the end of the string so far
array_pop($stk);
//print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n");
} elseif (($chrs{$c} == '[') &&
in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
// found a left-bracket, and we are in an array, object, or slice
array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false));
//print("Found start of array at {$c}\n");
} elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) {
// found a right-bracket, and we're in an array
array_pop($stk);
//print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
} elseif (($chrs{$c} == '{') &&
in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
// found a left-brace, and we are in an array, object, or slice
array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false));
//print("Found start of object at {$c}\n");
} elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) {
// found a right-brace, and we're in an object
array_pop($stk);
//print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
} elseif (($substr_chrs_c_2 == '/*') &&
in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
// found a comment start, and we are in an array, object, or slice
array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false));
$c++;
//print("Found start of comment at {$c}\n");
} elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) {
// found a comment end, and we're in one now
array_pop($stk);
$c++;
for ($i = $top['where']; $i <= $c; ++$i)
$chrs = substr_replace($chrs, ' ', $i, 1);
//print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
}
}
if (reset($stk) == SERVICES_JSON_IN_ARR) {
return $arr;
} elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
return $obj;
}
}
}
}
/**
* @todo Ultimately, this should just call PEAR::isError()
*/
function isError($data, $code = null){
if (class_exists('pear')) {
return PEAR::isError($data, $code);
} elseif (is_object($data) && (get_class($data) == 'services_json_error' ||
is_subclass_of($data, 'services_json_error'))) {
return true;
}
return false;
}
}
if (class_exists('PEAR_Error')) {
class Services_JSON_Error extends PEAR_Error{
function __construct($message = 'unknown error', $code = null,
$mode = null, $options = null, $userinfo = null){
parent::PEAR_Error($message, $code, $mode, $options, $userinfo);
}
}
} else {
class Services_JSON_Error{
function __construct($message = 'unknown error', $code = null,
$mode = null, $options = null, $userinfo = null){
}
}
}
File diff suppressed because it is too large Load Diff
+170
View File
@@ -0,0 +1,170 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
class Downloader {
static function start($url,$saveFile,$timeout = 10) {
$dataFile = $saveFile . '.download.cfg';
$saveTemp = $saveFile . '.downloading';
//header:{'url','length','name','supportRange'}
if(is_array($url)){
$fileHeader = $url;
}else{
$fileHeader = url_header($url);
}
$url = $fileHeader['url'];
if(!$url){
return array('code'=>false,'data'=>'url error!');
}
//默认下载方式if not support range
if(!$fileHeader['supportRange'] ||
$fileHeader['length'] == 0 ){
@unlink($saveTemp);@unlink($saveFile);
$result = self::fileDownloadFopen($url,$saveFile,$fileHeader['length']);
if($result['code']) {
return $result;
}else{
@unlink($saveTemp);@unlink($saveFile);
$result = self::fileDownloadCurl($url,$saveFile,false,0,$fileHeader['length']);
@unlink($saveTemp);@unlink($saveFile);
return $result;
}
}
$existsLength = is_file($saveTemp) ? filesize($saveTemp) : 0;
$contentLength = intval($fileHeader['length']);
if( file_exists($saveTemp) &&
time() - filemtime($saveTemp) < 3) {//has Changed in 3s,is downloading
return array('code'=>false,'data'=>'downloading');
}
$existsData = array();
if(is_file($dataFile)){
$tempData = file_get_contents($dataFile);
$existsData = json_decode($tempData, 1);
}
// exist and is the same file;
if( file_exists($saveFile) && $contentLength == filesize($saveFile)){
@unlink($saveTemp);
@unlink($dataFile);
return array('code'=>true,'data'=>'exist');
}
// check file is expire
if ($existsData['length'] != $contentLength) {
$existsData = array('length' => $contentLength);
}
if($existsLength > $contentLength){
@unlink($saveTemp);
}
// write exists data
file_put_contents($dataFile, json_encode($existsData));
$result = self::fileDownloadCurl($url,$saveFile,true,$existsLength,$contentLength);
if($result['code']){
@unlink($dataFile);
}
return $result;
}
// fopen then download
static function fileDownloadFopen($url, $fileName,$headerSize=0){
@ini_set('user_agent','Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36');
$fileTemp = $fileName.'.downloading';
@set_time_limit(0);
@unlink($fileTemp);
if ($fp = @fopen ($url, "rb")){
if(!$downloadFp = @fopen($fileTemp, "wb")){
return array('code'=>false,'data'=>'open_downloading_error');
}
while(!feof($fp)){
if(!file_exists($fileTemp)){//删除目标文件;则终止下载
fclose($downloadFp);
return array('code'=>false,'data'=>'stoped');
}
//对于部分fp不结束的通过文件大小判断
clearstatcache();
if( $headerSize>0 &&
$headerSize==get_filesize(iconv_system($fileTemp))
){
break;
}
fwrite($downloadFp, fread($fp, 1024 * 8 ), 1024 * 8);
}
//下载完成,重命名临时文件到目标文件
fclose($downloadFp);
fclose($fp);
self::checkGzip($fileTemp);
if(!@rename($fileTemp,$fileName)){
usleep(round(rand(0,1000)*50));//0.01~10ms
@unlink($fileName);
$res = @rename($fileTemp,$fileName);
if(!$res){
return array('code'=>false,'data'=>'rename error![open]');
}
}
return array('code'=>true,'data'=>'success');
}else{
return array('code'=>false,'data'=>'url_open_error');
}
}
// curl 方式下载
// 断点续传 http://www.linuxidc.com/Linux/2014-10/107508.htm
static function fileDownloadCurl($url, $fileName,$supportRange=false,$existsLength=0,$length=0){
$fileTemp = $fileName.'.downloading';
@set_time_limit(0);
if ($fp = @fopen ($fileTemp, "a")){
$ch = curl_init($url);
//断点续传
if($supportRange){
curl_setopt($ch, CURLOPT_RANGE, $existsLength."-");
}
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_REFERER,get_url_link($url));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36');
$res = curl_exec($ch);
curl_close($ch);
fclose($fp);
$filesize = get_filesize(iconv_system($fileTemp));
if($filesize < $length && $length!=0){
return array('code'=>false,'data'=>'downloading');
}
if($res && filesize($fileTemp) != 0){
self::checkGzip($fileTemp);
if(!@rename($fileTemp,$fileName)){
@unlink($fileName);
$res = @rename($fileTemp,$fileName);
if(!$res){
return array('code'=>false,'data'=>'rename error![curl]');
}
}
return array('code'=>true,'data'=>'success');
}
return array('code'=>false,'data'=>'curl exec error!');
}else{
return array('code'=>false,'data'=>'file create error');
}
}
static function checkGzip($file){
$char = "\x1f\x8b";
$str = file_sub_str($file,0,2);
if($char != $str) return;
ob_start();
readgzfile($file);
$out = ob_get_clean();
file_put_contents($file,$out);
}
}
+220
View File
@@ -0,0 +1,220 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
/**
* 数据的缓存存储类;key=>value 模式;value可以是任意类型数据。
* 完整流程测试;读取最低5000次/s 含有写的1000次/s
* get($find=null)
* 1.get(); //返回所有
* 2.get(key); //直接通过key获取
* 3.get(data_key,value); //搜索key为value的数据 直接返回数据不含key
* 4.get(array('key','value')); //搜索数据,符合key为指定value的所有数据;key value形式
*
* set($find=null,$change=null)
* 1.set(string,val) //添加或更新;
* 2.set(array('key','value_find'),array('key','change_to')) //查找方式更新 多条数据
*
* remove($find,$value)
* 1.remove(); //清空
* 2.remove(string); //删除 eg:set('37'),删除key为37的数据 存在且删除成功则返回true
* 3.remove(array('key','value_find')); //查找方式删除;多条数据
* reset($arr);//初始化数据
*/
define('CONFIG_EXIT', '<?php exit;?>');
class FileCache{
private $data;
private $file;
private $fileHash;//最后一次修改;保存时判断,如果有新修改则先读取再保存
function __construct($file) {
$this->file = $file;
$this->data= self::load($file);
$this->fileChangeCheck();
}
public function get($find=null,$value=null){
if (is_null($find)){
return $this->data;
}else if(is_array($find)){//查找内容数据方式获取;返回多条
$result = array();
foreach ($this->data as $key => $val) {
if ($val[$find[0]] == $find[1]) {
$result[$key] = $this->data[$key];
}
}
if(count($result)!=0){
return $result;
}
}else{//单条数据获取
$find .= '';//字符串
if(!is_null($value)){//通过某个key寻找单条数据
foreach ($this->data as $key => $val) {
if ($val[$find] == $value) {
return $val;
}
}
}
if(isset($this->data[$find])){
return $this->data[$find];
}
}
return false;
}
//添加或更新
public function set($find,$value){
$this->fileChangeCheck();
//最后有修改则先更新本地。
if(is_string($find)){//单条数据更新
$this->data[$find] = $value;
}else if(is_array($find)){//查找方式更新;更新多条
foreach ($this->data as $key => $val) {
if ($val[$find[0]] == $find[1]) {
$this->data[$key][$value[0]] = $value[1];
}
}
}else{
return false;
}
self::save($this->file,$this->data);
return true;
}
//删除,查找删除
public function remove($find){
$this->fileChangeCheck();
if(is_string($find)){//单条数据删除
unset($this->data[$find]);
}else if(is_array($find)){//查找删除
foreach ($this->data as $key => $val) {
if ($val[$find[0]] == $find[1]){
unset($this->data[$key]);
}
}
}else{
return false;
}
self::save($this->file,$this->data);
return true;
}
private function fileChangeCheck(){
if(is_null($this->fileHash)){
$this->fileHash = @md5_file($this->file);
return;
}
//是否发生改变
$lastHash = @md5_file($this->file);
if($lastHash != $this->fileHash){
$this->fileHash = $lastHash;
$this->data= self::load($this->file);
}
}
public function reset($data,$save = true){
$this->data = $data;
if($save){
self::save($this->file,$this->data);
}
}
//=====================================================
public static function arrSort(&$arr,$key, $type = 'asc'){
$keysValue = $newArray = array();
foreach ($arr as $k => $v) {
$keysValue[$k] = $v[$key];
}
if ($type == 'asc') {
asort($keysValue);
} else {
arsort($keysValue);
}
reset($keysValue);
foreach ($keysValue as $k => $v) {
$newArray[$k] = $arr[$k];
}
return $newArray;
}
public function getMaxId(){
$minId = 100;
if(count($this->data)==0){
return $minId;//一切从100开始
}
$idArr = array_keys($this->data);
rsort($idArr,SORT_NUMERIC);//id从高到底
$the_id = intval($idArr[0])+1;
if($the_id<=$minId){
return $minId;
}
return $the_id;
}
/**
* 加载数据;并解析成程序数据
*/
public static function load($file){//10000次需要4s 数据量差异不大。
if (!$file) return false;
$file = iconv_system($file);
if ( !file_exists($file) ){
@file_put_contents($file,CONFIG_EXIT.'[]');
chmod_path($file,0777);
return array();
}
$str = file_read_safe($file,10.5);
if( $str === false || $str === 0 || $str === -1){
show_tips('[Error Code:1010] FileCache data read error!<br/>'.get_path_this($file));
}
if (strlen($str) == 0 ||
strlen($str) == strlen(CONFIG_EXIT) ){
@file_put_contents($file,CONFIG_EXIT.'[]');
chmod_path($file,0777);
return array();
}
if($str === false || strlen($str) < strlen(CONFIG_EXIT) ){
show_tips('[Error Code:1011] FileCache data error!<br/>'.get_path_this($file));
}
$data= json_decode(substr($str, strlen(CONFIG_EXIT)),true);
if (is_null($data)) $data = array();
return $data;
}
/**
* 保存数据;
*/
public static function save($file,$data){//10000次需要6s
if (!$file) return false;
$file = iconv_system($file);
if ( !file_exists($file) ){
@file_put_contents($file,CONFIG_EXIT.'[]');
chmod_path($file,0777);
}
if (!path_writeable($file)) {
show_tips(BASIC_PATH."<br/>".LNG('path_can_not_write_data'));
}
if(defined('JSON_PRETTY_PRINT')){
$jsonStr = json_encode($data,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
}else{
$jsonStr = json_encode($data);
}
if(is_null($jsonStr) || strlen($jsonStr) == 0){//含有二进制或非utf8字符串对应检测
show_tips('[Error Code:1013] json_encode error!<br/>'.get_path_this($file));
}
$result = file_wirte_safe($file,CONFIG_EXIT.$jsonStr,10.5);
if($result === false){
show_tips('[Error Code:1012] FileCache save error!<br/>'.get_path_this($file));
}
return $result;
}
}
+118
View File
@@ -0,0 +1,118 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
/**
* hook::add('function','function')
* hook::add('class:function','class.function')
*
* hook::run('class.function',param)
* hook::run('function',param)
*
*/
class Hook{
static private $events = array();
static public function get($event=false){
if(!$event){
return self::$events;
}else{
return self::$events[$event];
}
}
static public function apply($action,$args=array()) {
if(!is_string($action)){
return;
}
if(strstr($action,'.')){
$arr = explode('.',$action);
if(count($arr) !== 2){
return;
}
$className = $arr[0];
$functionName = $arr[1];
if(class_exists($className)){
$class = new $className();
if( method_exists($class,$functionName) ){
//return $class -> $functionName($args);
return @call_user_func_array(array($class,$functionName), $args);
}
}
}else{
if(function_exists($action)){
return @call_user_func_array($action, $args);
}
}
}
static public function bind($event,$action,$once=false) {
if(!isset(self::$events[$event])){
self::$events[$event] = array();
}
if(!is_array($action)){
$action = array($action);
}
for ($i=0; $i < count($action); $i++) {
self::$events[$event][] = array(
'action' => $action[$i],
'once' => $once,
'times' => 0
);
}
}
static public function once($event,$action) {
self::bind($event,$action,true);
}
static public function unbind($event) {
self::$events[$event] = false;
}
//数据处理;只支持传入一个参数
static public function filter($event,&$param) {
$result = self::trigger($event,$param);
if($result){
$param = $result;
}
}
static public function trigger($event) {
$events = self::$events;
if( !isset($events[$event]) ){
return;
}
$actions = $events[$event];
$result = false;
if(is_array($actions) && count($actions) >= 1) {
$args = func_get_args();
array_shift($args);
for ($i=0; $i < count($actions); $i++) {
$action = $actions[$i];
if( $action['once'] && $action['times'] > 1){
continue;
}
if(defined("GLOBAL_DEBUG_HOOK") && GLOBAL_DEBUG_HOOK){
write_log($event.'==>start: '.$action['action'],'hook-trigger');
}
self::$events[$event][$i]['times'] = $action['times'] + 1;
$res = self::apply($action['action'],$args);
if(defined("GLOBAL_DEBUG_HOOK") && GLOBAL_DEBUG_HOOK){
write_log($event.'==>end['.$action['times'].']: '.$action['action'],'hook-trigger');
}
//避免循环调用
if( $action['times'] >= 5000){
show_json("ERROR,Too many trigger on:".$event.'==>'.$action['action'],fasle);
}
if(!is_null($res)){
$result = $res;
}
}
}
return $result;
}
}
+121
View File
@@ -0,0 +1,121 @@
<?php
function LNG($key){
if (func_num_args() == 1) {
return I18n::get($key);
} else {
$args = func_get_args();
array_shift($args);
return vsprintf(I18n::get($key), $args);
}
}
class I18n{
private static $loaded = false;
private static $lang = NULL;
public static $langType = NULL;
public static function defaultLang(){
if(isset($GLOBALS['config']['settings']['language'])){
return $GLOBALS['config']['settings']['language'];
}
$lang = "en";
$arr = $GLOBALS['config']['settingAll']['language'];
$langs = array();
if(!$arr) return 'zh-CN';
foreach ($arr as $key => $value) {
$langs[$key] = $key;
}
$langs['zh'] = 'zh-CN'; //增加大小写对应关系
$langs['zh-tw'] = 'zh-TW';
$acceptLanguage = array();
if(!isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){
$httpLang = 'en';
}else{
$httpLang = str_replace("_","-",strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']));
}
preg_match_all('~([-a-z]+)(;q=([0-9.]+))?~',$httpLang,$matches,PREG_SET_ORDER);
foreach ($matches as $match) {
$acceptLanguage[$match[1]] = (isset($match[3]) ? $match[3] : 1);
}
arsort($acceptLanguage);
foreach ($acceptLanguage as $key => $q) {
if (isset($langs[$key])) {
$lang = $langs[$key];break;
}
$key = preg_replace('~-.*~','', $key);
if (!isset($acceptLanguage[$key]) && isset($langs[$key])) {
$lang = $langs[$key];break;
}
}
return $lang;
}
public static function getAll(){
self::init();
return self::$lang;
}
public static function getType(){
self::init();
return self::$langType;
}
public static function init(){
if(self::$loaded !== false){
return;
}
$cookieLang = 'kodUserLanguage';
if (isset($_COOKIE[$cookieLang])) {
$lang = $_COOKIE[$cookieLang];
}else{
$lang = self::defaultLang();
//setcookie_header($cookieLang,$lang, time()+3600*24*100);
}
$lang = str_replace(array('/','\\','..','.'),'',$lang);
//兼容旧版本
if($lang == 'zh_CN') $lang = 'zh-CN';
if($lang == 'zh_TW') $lang = 'zh-TW';
if(isset($GLOBALS['config']['settings']['language'])){
$lang = $GLOBALS['config']['settings']['language'];
}
$langFile = LANGUAGE_PATH.$lang.'/main.php';
if(!file_exists($langFile)){//allow remove some I18n folder
$lang = 'en';
$langFile = LANGUAGE_PATH.$lang.'/main.php';
}
self::$langType = $lang;
self::$lang = include($langFile);
self::$loaded = true;
$GLOBALS['L'] = self::$lang;
}
public static function get($key){
self::init();
if(!isset(self::$lang[$key])){
return $key;
}
if (func_num_args() == 1) {
return self::$lang[$key];
} else {
$args = func_get_args();
array_shift($args);
return vsprintf(self::$lang[$key], $args);
}
}
/**
* 添加多语言;
* @param [type] $args [description]
*/
public static function set($array){
self::init();
if(!is_array($array)) return;
foreach ($array as $key => $value) {
self::$lang[$key] = $value;
}
}
}
+290
View File
@@ -0,0 +1,290 @@
<?php
/**
* 功能:图片处理
* 基本参数:$srcFile,$echoType
*
* eg
* $cm=new ImageThumb('1.jpg','file');
*
* $cm->Distortion('dis_bei.jpg',150,200); //生成固定宽高缩略图;
* $cm->Prorate('pro_bei.jpg',150,200); //等比缩略图;附带切割
* $cm->Cut('cut_bei.jpg',150,200); //等比缩略图;多出部分切割
* $cm->BackFill('fill_bei.jpg',150,200); //等比缩略图;多出部分填充
*
* $cm->imgRotate('out.jpg',90); //旋转图片
*/
class ImageThumb {
var $srcFile = ''; //原图
var $imgData = ''; //图片信息
var $echoType; //输出图片类型,link--不保存为文件;file--保存为文件
var $im = ''; //临时变量
var $srcW = ''; //原图宽
var $srcH = ''; //原图高
function __construct($srcFile, $echoType){
$this->srcFile = $srcFile;
$this->echoType = $echoType;
$this->im = self::image($srcFile);
if(!$this->im){
return false;
}
$info = '';
$this->imgData = GetImageSize($srcFile, $info);
$this->srcW = imageSX($this->im);
$this->srcH = imageSY($this->im);
return $this;
}
public static function image($file){
$info = '';
$data = GetImageSize($file, $info);
$img = false;
//var_dump($data,$file,memory_get_usage()-$GLOBALS['config']['appMemoryStart']);
switch ($data[2]) {
case IMAGETYPE_GIF:
if (!function_exists('imagecreatefromgif')) {
break;
}
$img = imagecreatefromgif($file);
break;
case IMAGETYPE_JPEG:
if (!function_exists('imagecreatefromjpeg')) {
break;
}
$img = imagecreatefromjpeg($file);
break;
case IMAGETYPE_PNG:
if (!function_exists('imagecreatefrompng')) {
break;
}
$img = @imagecreatefrompng($file);
imagesavealpha($img,true);
break;
case IMAGETYPE_XBM:
$img = imagecreatefromxbm($file);
break;
case IMAGETYPE_WBMP:
$img = imagecreatefromwbmp($file);
break;
case IMAGETYPE_BMP:
$img = imagecreatefrombmp($file);
break;
default:break;
}
return $img;
}
public static function imageSize($file){
$size = GetImageSize($file);
if(!$size){
return false;
}
return array('width'=>$size[0],"height"=>$size[1]);
}
// 生成扭曲型缩图
function distortion($toFile, $toW, $toH){
$cImg = $this->creatImage($this->im, $toW, $toH, 0, 0, 0, 0, $this->srcW, $this->srcH);
return $this->echoImage($cImg, $toFile);
}
// 生成按比例缩放的缩图
function prorate($toFile, $toW, $toH){
$toWH = $toW / $toH;
$srcWH = $this->srcW / $this->srcH;
if ($toWH<=$srcWH) {
$ftoW = $toW;
$ftoH = $ftoW * ($this->srcH / $this->srcW);
} else {
$ftoH = $toH;
$ftoW = $ftoH * ($this->srcW / $this->srcH);
}
if ($this->srcW > $toW || $this->srcH > $toH) {
$cImg = $this->creatImage($this->im, $ftoW, $ftoH, 0, 0, 0, 0, $this->srcW, $this->srcH);
return $this->echoImage($cImg, $toFile);
} else {
$cImg = $this->creatImage($this->im, $this->srcW, $this->srcH, 0, 0, 0, 0, $this->srcW, $this->srcH);
return $this->echoImage($cImg, $toFile);
}
}
// 生成最小裁剪后的缩图
function cut($toFile, $toW, $toH){
$toWH = $toW / $toH;
$srcWH = $this->srcW / $this->srcH;
if ($toWH<=$srcWH) {
$ctoH = $toH;
$ctoW = $ctoH * ($this->srcW / $this->srcH);
} else {
$ctoW = $toW;
$ctoH = $ctoW * ($this->srcH / $this->srcW);
}
$allImg = $this->creatImage($this->im, $ctoW, $ctoH, 0, 0, 0, 0, $this->srcW, $this->srcH);
$cImg = $this->creatImage($allImg, $toW, $toH, 0, 0, ($ctoW - $toW) / 2, ($ctoH - $toH) / 2, $toW, $toH);
imageDestroy($allImg);
return $this->echoImage($cImg, $toFile);
}
// 生成背景填充的缩图,默认用白色填充剩余空间,传入$isAlpha为真时用透明色填充
function backFill($toFile, $toW, $toH,$isAlpha=false,$red=255, $green=255, $blue=255){
$toWH = $toW / $toH;
$srcWH = $this->srcW / $this->srcH;
if ($toWH<=$srcWH) {
$ftoW = $toW;
$ftoH = $ftoW * ($this->srcH / $this->srcW);
} else {
$ftoH = $toH;
$ftoW = $ftoH * ($this->srcW / $this->srcH);
}
if (function_exists('imagecreatetruecolor')) {
@$cImg = imageCreateTrueColor($toW, $toH);
if (!$cImg) {
$cImg = imageCreate($toW, $toH);
}
} else {
$cImg = imageCreate($toW, $toH);
}
$fromTop = ($toH - $ftoH)/2;//从正中间填充
$backcolor = imagecolorallocate($cImg,$red,$green, $blue); //填充的背景颜色
if ($isAlpha){//填充透明色
$backcolor=imageColorTransparent($cImg,$backcolor);
$fromTop = $toH - $ftoH;//从底部填充
}
imageFilledRectangle($cImg, 0, 0, $toW, $toH, $backcolor);
if ($this->srcW > $toW || $this->srcH > $toH) {
$proImg = $this->creatImage($this->im, $ftoW, $ftoH, 0, 0, 0, 0, $this->srcW, $this->srcH);
if ($ftoW < $toW) {
imageCopy($cImg, $proImg, ($toW - $ftoW) / 2, 0, 0, 0, $ftoW, $ftoH);
} else if ($ftoH < $toH) {
imageCopy($cImg, $proImg, 0, $fromTop, 0, 0, $ftoW, $ftoH);
} else {
imageCopy($cImg, $proImg, 0, 0, 0, 0, $ftoW, $ftoH);
}
} else {
imageCopyMerge($cImg, $this->im, ($toW - $ftoW) / 2,$fromTop, 0, 0, $ftoW, $ftoH, 100);
}
return $this->echoImage($cImg, $toFile);
}
function creatImage($img, $creatW, $creatH, $dstX, $dstY, $srcX, $srcY, $srcImgW, $srcImgH){
if (function_exists('imagecreatetruecolor')) {
@$creatImg = ImageCreateTrueColor($creatW, $creatH);
@imagealphablending($creatImg,false);//是不合并颜色,直接用$img图像颜色替换,包括透明色;
@imagesavealpha($creatImg,true);//不要丢了$thumb图像的透明色;
if ($creatImg){
imageCopyResampled($creatImg, $img, $dstX, $dstY, $srcX, $srcY, $creatW, $creatH, $srcImgW, $srcImgH);
}else {
$creatImg = ImageCreate($creatW, $creatH);
imageCopyResized($creatImg, $img, $dstX, $dstY, $srcX, $srcY, $creatW, $creatH, $srcImgW, $srcImgH);
}
} else {
$creatImg = ImageCreate($creatW, $creatH);
imageCopyResized($creatImg, $img, $dstX, $dstY, $srcX, $srcY, $creatW, $creatH, $srcImgW, $srcImgH);
}
return $creatImg;
}
// Rotate($toFile, 90);
public function imgRotate($toFile,$degree) {
if (!$this->im ||
$degree % 360 === 0 ||
!function_exists('imageRotate')) {
return false;
}
$rotate = imageRotate($this->im,360-$degree,0);
$result = false;
switch ($this->imgData[2]) {
case IMAGETYPE_GIF:
$result = imagegif($rotate, $toFile);
break;
case IMAGETYPE_JPEG:
$result = imagejpeg($rotate, $toFile,100);//压缩质量
break;
case IMAGETYPE_PNG:
$result = imagePNG($rotate, $toFile);
break;
default:break;
}
imageDestroy($rotate);
imageDestroy($this->im);
return $result;
}
// 输出图片,link---只输出,不保存文件。file--保存为文件
function echoImage($img, $toFile){
if(!$img) return false;
ob_get_clean();
$result = false;
switch ($this->echoType) {
case 'link':$result = imagePNG($img);break;
case 'file':$result = imagePNG($img, $toFile);break;
//return ImageJpeg($img, $to_File);
}
imageDestroy($img);
imageDestroy($this->im);
return $result;
}
}
if(!function_exists('imageflip')){
/**
* Flip (mirror) an image left to right.
*
* @param image resource
* @param x int
* @param y int
* @param width int
* @param height int
* @return bool
* @require PHP 3.0.7 (function_exists), GD1
*/
define('IMG_FLIP_HORIZONTAL', 0);
define('IMG_FLIP_VERTICAL', 1);
define('IMG_FLIP_BOTH', 2);
function imageflip($image, $mode) {
switch ($mode) {
case IMG_FLIP_HORIZONTAL: {
$max_x = imagesx($image) - 1;
$half_x = $max_x / 2;
$sy = imagesy($image);
$temp_image = imageistruecolor($image)? imagecreatetruecolor(1, $sy): imagecreate(1, $sy);
for ($x = 0; $x < $half_x; ++$x) {
imagecopy($temp_image, $image, 0, 0, $x, 0, 1, $sy);
imagecopy($image, $image, $x, 0, $max_x - $x, 0, 1, $sy);
imagecopy($image, $temp_image, $max_x - $x, 0, 0, 0, 1, $sy);
}
break;
}
case IMG_FLIP_VERTICAL: {
$sx = imagesx($image);
$max_y = imagesy($image) - 1;
$half_y = $max_y / 2;
$temp_image = imageistruecolor($image)? imagecreatetruecolor($sx, 1): imagecreate($sx, 1);
for ($y = 0; $y < $half_y; ++$y) {
imagecopy($temp_image, $image, 0, 0, 0, $y, $sx, 1);
imagecopy($image, $image, 0, $y, 0, $max_y - $y, $sx, 1);
imagecopy($image, $temp_image, 0, $max_y - $y, 0, 0, $sx, 1);
}
break;
}
case IMG_FLIP_BOTH: {
$sx = imagesx($image);
$sy = imagesy($image);
$temp_image = imagerotate($image, 180, 0);
imagecopy($image, $temp_image, 0, 0, 0, 0, $sx, $sy);
break;
}
default: {
return;
}
}
imagedestroy($temp_image);
}
}
if(!function_exists('imagecreatefrombmp')){
function imagecreatefrombmp( $filename ){
return imageGdBMP::load($filename);
}
}
+332
View File
@@ -0,0 +1,332 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
define('ARCHIVE_LIB',dirname(__FILE__).'/archiveLib/');
define('PCLZIP_TEMPORARY_DIR',TEMP_PATH);
define('PCLTAR_TEMPORARY_DIR',TEMP_PATH);
define('PCLZIP_SEPARATOR',';@@@,');//压缩多个文件,组成字符串分割
mk_dir(TEMP_PATH);
require_once ARCHIVE_LIB.'pclerror.lib.php';
require_once ARCHIVE_LIB.'pcltrace.lib.php';
require_once ARCHIVE_LIB.'pcltar.lib.php';
require_once ARCHIVE_LIB.'pclzip.class.php';
require_once ARCHIVE_LIB.'kodRarArchive.class.php';
require_once ARCHIVE_LIB.'kodZipArchive.class.php';
class KodArchive {
/**
* [checkIfType get the app by ext]
* @param [type] $guess [check]
* @param [type] $ext [file ext]
* @return [type] [description]
*/
static function checkIfType($ext,$appType){
$extArray = array(
'zip' => array('zip','ipa','apk','epub'),
'tar' => array('tar','tar.gz','tgz','gz'),
'rar' => array('rar','7z','xz','bz2','arj','cab','iso')
);
$result = in_array($ext,$extArray[$appType]);
if( $result &&
($appType == 'zip' || $appType == 'tar') &&
(!function_exists('gzopen') || !function_exists('gzinflate'))
){
show_tips("[Error] Can't Open; Missing zlib extensions");
}
if( $result && $appType == 'rar' &&
(!function_exists('shell_exec') || !strstr(shell_exec('echo "kodcloud"'),'kodcloud'))
){
show_tips("[Error] Can't Open; shell_exec Can't use");
}
return $result;
}
/**
* [listContent description]
* @param [type] $file [archive file]
* @return [type] [array or false]
*/
static function listContent($file,$output=true) {
$ext = get_path_ext($file);
$result = false;
if( self::checkIfType($ext,'tar') ){
//TrOn(10);
$resultOld = PclTarList($file);
//TrDisplay();exit;
$result = array();
for ($i=0; $i < count($resultOld); $i++) {
$item = $resultOld[$i];
//http://rpm5.org/docs/api/tar_8c-source.html
if( $item['typeflag'] == 'x' || $item['typeflag'] == 'g'){
continue;
}
if($output){
$item['filename'] = ltrim($item['filename'],'./');
}
if($item['typeflag'] == '5'){
$item['folder'] = true;
}else{
$item['folder'] = false;
}
$item['index'] = $i;
$result[] = $item;
}
}else if( self::checkIfType($ext,'rar') ){
$appResult = kodRarArchive::listContent($file);
if(!$appResult['code']){
return $appResult;
}else{
$result = $appResult['data'];
}
}else{//默认zip
if(kodZipArchive::support('list')){
$result = kodZipArchive::listContent($file);
}else{
$zip = new PclZip($file);
$result = $zip->listContent();
}
}
if($result){
//编码转换
$charset = unzip_charset_get($result);
$output = $output && function_exists('iconv');
for ($i=0; $i < count($result); $i++) {
//不允许相对路径
$result[$i]['filename'] = str_replace(array('../','..\\'),"_",$result[$i]['filename']);
// $charset = get_charset($result[$i]['filename']);
if($output){
$result[$i]['filename'] = iconv_to($result[$i]['filename'],$charset,'utf-8');
unset($result[$i]['stored_filename']);
}
}
return array('code'=>true,'data'=>$result);
}else{
return array('code'=>false,'data'=>$result);
}
}
/**
* [extract description]
* @param [type] $file [archive file]
* @param [type] $dest [extract to folder]
* @param string $part [archive file content]
* @return [type] [array]
*/
static function extract($file, $dest, $part = '-1',&$partName=false) {
$ext = get_path_ext($file);
$listContent = self::listContent($file,false);//不转码
if(!$listContent['code']){
return $listContent;
}
if($part != '-1'){//解压部分.则构造 $pathRemove $indexPath
$indexInfo = self::fileIndex($listContent['data'],$part);
$partName = str_replace(array('../','..\\'),'_',$indexInfo['filename']);
$indexPath = $partName;
if($GLOBALS['config']['systemCharset'] != 'utf-8'){
$indexPath = unzip_pre_name($partName);//系统编码
}
//$pathRemove = get_path_father($indexPath);
$pathRemove = get_path_father($partName);//中文情况文件情况兼容
if($indexInfo['folder']){
$indexPath = rtrim($indexPath,'/').'/';//tar 解压文件夹需要/结尾
$partName = array($partName);
}
$tempCheck = str_replace('\\','/',$indexPath);
if(substr($tempCheck,-1) == '/'){
//跟目录;需要追加一层文件夹;window a\b\c\ linux a/b/c/
if( !strstr(trim($tempCheck,'/'),'/') ){
$dest = $dest.unzip_pre_name(get_path_this($tempCheck)).'/';
}
}else{
if($pathRemove == $indexPath){//根目录文件;
$pathRemove = '';
}
}
//debug_out($indexInfo,$indexPath,$partName,$pathRemove,$tempCheck);
}
if( self::checkIfType($ext,'tar') ){
//TrOn(10);
if($part != '-1'){
//tar 默认都进行转码;
$indexPath = unzip_pre_name($indexPath);
$pathRemove = unzip_pre_name($pathRemove);
$result = PclTarExtractList($file,array($indexPath),$dest,$pathRemove);
}else{
$result = PclTarExtract($file,$dest);
}
//TrDisplay();exit;
return array('code'=>$result,'data'=>PclErrorString(true));
}else if( self::checkIfType($ext,'rar')){ // || $ext == 'zip'
return kodRarArchive::extract($file,$dest,$ext,$partName);
}else if(kodZipArchive::support('extract')){
return kodZipArchive::extract($file,$dest,$partName);
}else{
$zip = new PclZip($file);
//解压内部的一部分,按文件名或文件夹来
if($part != '-1'){
$result = $zip->extract(PCLZIP_OPT_PATH,$dest,
PCLZIP_OPT_SET_CHMOD,DEFAULT_PERRMISSIONS,
PCLZIP_CB_PRE_FILE_NAME,'unzip_pre_name',
PCLZIP_OPT_BY_NAME,$indexInfo['filename'],
PCLZIP_OPT_REMOVE_PATH,$pathRemove,
PCLZIP_OPT_REPLACE_NEWER);
}else{
$result = $zip->extract(PCLZIP_OPT_PATH,$dest,
PCLZIP_OPT_SET_CHMOD,DEFAULT_PERRMISSIONS,
PCLZIP_CB_PRE_FILE_NAME,'unzip_pre_name',
PCLZIP_OPT_REPLACE_NEWER);//解压到某个地方,覆盖方式
}
return array('code'=>$result,'data'=>$zip->errorName(true));
}
return array('code'=>false,'data'=>'File Type Not Support');
}
static function fileIndex($list,$index,$key=false){
if(!is_array($list)) return false;
$len = count($list);
for ($i=0; $i < $len; $i++) {
if($index == $list[$i]['index']){
$item = $list[$i];
break;
}
}
if(!$item){
show_tips('KodArchive:fileIndex; index error;file not exists!');
}
$result = $item;
if($key){
$result = $item[$key];
if($item['folder']){
$result = rtrim($result,'/').'/';//tar 解压文件夹需要结尾/
}
}
return $result;
}
static function extractZipFile($file,$byName,$cacheName = false){
$temp = TEMP_PATH.'archivePreview/'.hash_path($file).'/';
mk_dir($temp);
touch(TEMP_PATH.'archivePreview/index.html');
$newFile = $temp.md5($file.$byName);
if($cacheName){
$newFile = $temp.$cacheName;
}
if(file_exists($newFile)){
return $newFile;
}
$zip = new PclZip($file);
$outFile = unzip_filter_ext($temp.get_path_this($byName));
$parent = get_path_father($byName);
if($parent == $byName){
$parent = '';
}
$result = $zip->extract(
PCLZIP_OPT_PATH,$temp,
PCLZIP_CB_PRE_FILE_NAME,'unzip_pre_name',
PCLZIP_OPT_REMOVE_PATH,$parent,
PCLZIP_OPT_BY_NAME,$byName);
if(!file_exists($outFile)){
return false;
}
@rename($outFile,$newFile);
return $newFile;
}
/**
* [filePreview file preview or download a file;]
* 解压后自动缓存;
* @param [type] $file [archive file name]
* @param [type] $index [file index]
* @return [type] [echo to client;]
*/
static function filePreview($file,$index,$download=false,$byName = false){
$temp = TEMP_PATH.'archivePreview/'.hash_path($file).'/';
mk_dir($temp);
touch(TEMP_PATH.'archivePreview/index.html');
$newFile = $temp.md5($file.$index.$byName);
$partName = '';//引用传值,传入处理
$result = self::extract($file, $temp,$index,$partName);
if(is_array($partName)){//不能是数组——文件夹
show_json('unzip preview folder error!',false);
}
if(file_exists($newFile)){
file_put_out($newFile,$download,get_path_this($partName));
return;
}
//$partName 压缩文件原名;初始编码;转为当前文件系统编码
$partName = unzip_pre_name($partName);
$filenameOutput = get_path_this($partName);
$outFile = unzip_filter_ext($temp.$filenameOutput);
if(!$result['code']){
show_json($result['data'],false);
}
//debug_out($partName,$file,$outFile,$byName);
if(!file_exists($outFile)){
show_json('unzip error!',false);
}
@rename($outFile,$newFile);
if(!file_exists($newFile)){
del_dir($temp);
show_json('unzip:rename error!');
}
file_put_out($newFile,$download,$filenameOutput);
}
/**
* [create description]
* @param [type] $file [archive file name]
* @param [type] $files [files add;file or folders]
* @return [type] [bool]
*/
static function create($file,$files) {
$ext = get_path_ext($file);
$result = false;
if( self::checkIfType($ext,'zip') ){
if(kodZipArchive::support('add')){
return kodZipArchive::create($file,$files);
}
$archive = new PclZip($file);
foreach ($files as $key =>$val) {
$val = str_replace('//','/',$val);
$removePathPre = _DIR_CLEAR(get_path_father($val));
if($key == 0){
$result = $archive->create($val,
PCLZIP_OPT_REMOVE_PATH,$removePathPre,
PCLZIP_CB_PRE_FILE_NAME,'zip_pre_name'
);
continue;
}
$result = $archive->add($val,
PCLZIP_OPT_REMOVE_PATH,$removePathPre,
PCLZIP_CB_PRE_FILE_NAME,'zip_pre_name'
);
}
}else if( self::checkIfType($ext,'tar') ){
//TrOn(10);
foreach ($files as $key =>$val) {
$val = str_replace('//','/',$val);
$removePathPre = _DIR_CLEAR(get_path_father($val));
if($key == 0){
$result = PclTarCreate($file,array($val), $ext,null, $removePathPre);
continue;
}
$result = PclTarAddList($file,array($val),'',$removePathPre,$ext);
}
//TrDisplay();exit;
}
return $result;
}
}
+122
View File
@@ -0,0 +1,122 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*------
* 字符串加解密类;
* 一次一密;且定时解密有效
* 可用于加密&动态key生成
* demo
* 加密:echo Mcrypt::encode('abc','123');
* 解密:echo Mcrypt::decode('9f843I0crjv5y0dWE_-uwzL_mZRyRb1ynjGK4I_IACQ','123');
*/
class Mcrypt{
public static $default_key = 'a!takA:dlmcldEv,e';
/**
* 字符加解密,一次一密,可定时解密有效
*
* @param string $string 原文或者密文
* @param string $operation 操作(encode | decode)
* @param string $key 密钥
* @param int $expiry 密文有效期,单位s,0 为永久有效
* @return string 处理后的 原文或者 经过 base64_encode 处理后的密文
*/
public static function encode($string,$key = '', $expiry = 0){
$ckeyLength = 4;
$key = md5($key ? $key : self::$default_key); //解密密匙
$keya = md5(substr($key, 0, 16)); //做数据完整性验证
$keyb = md5(substr($key, 16, 16)); //用于变化生成的密文 (初始化向量IV)
$keyc = substr(md5(microtime()), - $ckeyLength);
$cryptkey = $keya . md5($keya . $keyc);
$keyLength = strlen($cryptkey);
$string = sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string . $keyb), 0, 16) . $string;
$stringLength = strlen($string);
$rndkey = array();
for($i = 0; $i <= 255; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $keyLength]);
}
$box = range(0, 255);
// 打乱密匙簿,增加随机性
for($j = $i = 0; $i < 256; $i++) {
$j = ($j + $box[$i] + $rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}
// 加解密,从密匙簿得出密匙进行异或,再转成字符
$result = '';
for($a = $j = $i = 0; $i < $stringLength; $i++) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
}
$result = $keyc . str_replace('=', '', base64_encode($result));
$result = str_replace(array('+', '/', '='),array('-', '_', '.'), $result);
return $result;
}
/**
* 字符加解密,一次一密,可定时解密有效
*
* @param string $string 原文或者密文
* @param string $operation 操作(encode | decode)
* @param string $key 密钥
* @param int $expiry 密文有效期,单位s,0 为永久有效
* @return string 处理后的 原文或者 经过 base64_encode 处理后的密文
*/
public static function decode($string,$key = '')
{
$string = str_replace(array('-', '_', '.'),array('+', '/', '='), $string);
$ckeyLength = 4;
$key = md5($key ? $key : self::$default_key); //解密密匙
$keya = md5(substr($key, 0, 16)); //做数据完整性验证
$keyb = md5(substr($key, 16, 16)); //用于变化生成的密文 (初始化向量IV)
$keyc = substr($string, 0, $ckeyLength);
$cryptkey = $keya . md5($keya . $keyc);
$keyLength = strlen($cryptkey);
$string = base64_decode(substr($string, $ckeyLength));
$stringLength = strlen($string);
$rndkey = array();
for($i = 0; $i <= 255; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $keyLength]);
}
$box = range(0, 255);
// 打乱密匙簿,增加随机性
for($j = $i = 0; $i < 256; $i++) {
$j = ($j + $box[$i] + $rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}
// 加解密,从密匙簿得出密匙进行异或,再转成字符
$result = '';
for($a = $j = $i = 0; $i < $stringLength; $i++) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
}
$theTime = intval(substr($result, 0, 10));
if (($theTime == 0 || $theTime - time() > 0)
&& substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)
) {
return substr($result, 26);
} else {
return '';
}
}
}
+303
View File
@@ -0,0 +1,303 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
class PluginBase{
public $in;
public $pluginName;
public $pluginPath;
public $pluginHost;
public $pluginHostDefault;
public $pluginApi;
public $packageData;
private $pluginLangArr;
private $pluginConfig;
function __construct(){
global $in,$config;
$this->config = &$config;
$this->in = &$in;
$this->pluginName = str_replace('Plugin','',get_class($this));
$this->pluginPath = PLUGIN_DIR.$this->pluginName.'/';
$this->pluginApi = rtrim(APP_HOST,'/').'/index.php?pluginApp/to/'.$this->pluginName.'/';
$this->pluginHost = $this->config['settings']['pluginHost'].$this->pluginName.'/';
$this->pluginHostDefault = PLUGIN_HOST.$this->pluginName.'/';
$this->pluginLangArr = $this->initLang();
return $this;
}
public function regiest(){
$this->hookRegiest(array());
$this->setConfig(array());
}
public function install(){}
public function update(){}
public function unInstall(){}
/**
* 注册hook到当前插件配置
* @param [type] $array [description]
* @return [type] [description]
*/
final function hookRegiest($array){
$id = $this->pluginName;
$systemConfig = &$this->config['settingSystem'];
if(!is_array($systemConfig['pluginList'])){
$systemConfig['pluginList'] = array();
}
if(is_array($systemConfig['pluginList'][$id])){
$systemConfig['pluginList'][$id]['regiest'] = $array;
}else{
$systemConfig['pluginList'][$id] = array(
'id' => $id,
'regiest' => $array,
'status' => 0,
'config' => $this->getConfig()
);
}
}
final function appIcon(){
$package = $this->appPackage();
$icon = '';
if(isset($package['source'])){
if($package['source']['icon']){
$icon = '<img class="icon" src="'.$package['source']['icon'].'"/>';
}else if($package['source']['className']){
$icon = "<i class='icon font-icon ".$package['source']['className']."'></i>";
}
}
return $icon;
}
final function filePath($path){
if(substr($path,0,4) == 'http'){
if(!request_url_safe($path)){
show_json(LNG('url error!'),false);
}
$cacheName = md5($path.'kodcloud').'.'.get_path_ext($path);
$cacheFile = $this->filePathName($cacheName);
mk_dir(get_path_father($cacheFile));
if(!file_exists($cacheFile)){
$result = url_request($path,'DOWNLOAD',$cacheFile);
}
$path = $cacheFile;
}else{
$path = _DIR($path);
//php7.1,含有中文文件,windows下 curl上传会有问题
if( strtoupper(substr(PHP_OS, 0,3)) === 'WIN' &&
version_compare(phpversion(), '7.1.0', '>=') &&
preg_match("/([\x81-\xfe][\x40-\xfe])/", $path, $match)){
$cacheName = hash_path($path).'.'.get_path_ext($path);
$cacheFile = $this->filePathName($cacheName);
mk_dir(get_path_father($cacheFile));
if(!file_exists($cacheFile)){
@copy($path,$cacheFile);
}
$path = $cacheFile;
}
}
if (!file_exists($path)) {
show_tips(LNG('file').' '.LNG('not_exists'));
}
return $path;
}
private function filePathName($fileName){
if(! checkExtSafe($fileName)){$fileName = $fileName.'.txt';}
return TEMP_PATH.$this->pluginName.'/files/'.$fileName;
}
/**
* 插件配置数据加载
* @return [type] [description]
*/
final function appPackage(){
if($this->packageData){
return $this->packageData;
}
$content = $this->parseFile($this->pluginPath.'package.json');
$this->parseLang($content);
$result = json_decode_force($content);
if(!$result){
return $content;
}
$this->packageData = $result;
return $result;
}
/**
* 获取package.json中的数据;通过key获取,支持auther.copyright 多级获取
* @param [type] $key [description]
* @return [type] [description]
*/
public function packageInfoGet($key){
$data = $this->appPackage();
$result = null;
$keyArr = explode('.',$key);
for ($i = 0; $i < count($keyArr); $i++) {
if($i == 0){
$result = $data[$keyArr[$i]];
continue;
}
if(is_array($result)){
$result = $result[$keyArr[$i]];
}else{
return null;
}
}
return $result;
}
public function packageVersion(){return $this->packageInfoGet('version');}
public function packageTitle(){return $this->packageInfoGet('title');}
public function packageCopyright(){return $this->packageInfoGet('auther.copyright');}
private function parseFile($file){
$content = file_get_contents($file);
$replaceFrom = array(
'{{pluginHost}}',
'{{pluginHostDefault}}',
'{{pluginApi}}',
'{{pluginName}}',
'{{pluginPath}}',
'{{appHost}}',
'{{staticPath}}',
//"\r","\n"
);
$replaceTo = array(
$this->pluginHost,
$this->pluginHostDefault,
$this->pluginApi,
$this->pluginName,
$this->pluginPath,
APP_HOST,
$this->config['settings']['staticPath'],
//" "," "
);
$content = str_replace($replaceFrom,$replaceTo,$content);
return $content;
}
private function parseLang(&$content){
$pre = '{{LNG.';
if(!strstr($content,$pre)){
return;
}
preg_match_all('/{{LNG\..*}}/isU',$content,$match);
if( !is_array($match) || count($match) == 0 ||
!is_array($match[0]) || count($match[0]) == 0 ){
return;
}
$replaceFrom = array();
$replaceTo = array();
foreach ($match[0] as $key) {
$langKey = substr($key,strlen($pre),-2); //{{LNG.file}}
$langVal = LNG($langKey);
$replaceFrom[] = $key;
$replaceTo[] = str_replace(
array("\n","\r","\t",'"'),
array(' ',' ','','\\"'),
$langVal
);
}
$content = str_replace($replaceFrom,$replaceTo,$content);
}
private function parseConfig(&$content){
$config = $this->getConfig();
$pre = '{{config.';
if(!strstr($content,$pre)){
return;
}
preg_match_all('/{{config\..*}}/isU',$content,$match);
if( !is_array($match) || count($match) == 0 ||
!is_array($match[0]) || count($match[0]) == 0 ){
return;
}
$replaceFrom = array();
$replaceTo = array();
foreach ($match[0] as $key) {
$langKey = substr($key,strlen($pre),-2); //{{config.file}}
$replaceFrom[] = $key;
$replaceTo[] = $config[$langKey];
}
$content = str_replace($replaceFrom,$replaceTo,$content);
}
/**
* 输出文件
* @param [type] $file [description]
* @return [type] [description]
*/
final function echoFile($file,$replace=false){
$filePath = $this->pluginPath.$file;
if(ACT == 'commonJs'){
echo "\n/* [".$this->pluginName.'/'.$file."] */";
if(!file_exists($filePath)){
echo " /* ==>[not exist]*/";
return;
}
}
$content = $this->parseFile($filePath);
$this->parseLang($content);
$this->parseConfig($content);
if(is_array($replace) && count($replace) == 2){
$content = str_replace($replace[0],$replace[1],$content);
}
echo "\n".$content;
}
/**
* 初始化多语言
* @return [type] [description]
*/
final function initLang(){
$default = 'en';
$path = $this->pluginPath.'i18n/';
$lang = I18n::getType();
$array = array();
if(file_exists($path.$lang.'.php')){
$array = include($path.$lang.'.php');
}else if(file_exists($path.$default.'.php')){
$array = include($path.$default.'.php');
}
if(!is_array($array)) return array();
if(count($array) > 0){
I18n::set($array);
}
return $array;
}
final function isFileExtence($st,$act){
if(in_array($st,array('desktop','editor','explorer','share','api'))){
return true;
}
return false;
}
/**
* 获取插件配置
* @return [type] [description]
*/
final function getConfig(){
if(!$this->pluginConfig){
$model = new PluginModel();
$this->pluginConfig = $model->getConfig($this->pluginName);
}
return $this->pluginConfig;
}
/**
* 修改插件配置
* @return [type] [description]
*/
final function setConfig($value){
$model = new PluginModel();
return $model->setConfig($this->pluginName,$value);
}
}
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,254 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
/**
* 7zip 解压缩: 7z,xz,bz2(bzip2),gz(gzip),tar,zip
* 7zip 仅解压: 7z,xz,,bz2(bzip2),gz(gzip),tar,zip,arj,cab,chm,cpio,deb,dmg,
* fat,hfs,iso,lzh,lzma,mbr,msi,nsis,ntfs,,rpm,udf,vhd,wim,xar,z
*
* rar 仅支持rar文件解压缩
* 目前使用解压功能:7z,bz2,zx,z,ios,arj;压缩功能暂停
* ------------
* 7zip命令行:http://blog.csdn.net/earbao/article/details/51382534
* rar命令行 :http://www.cnblogs.com/fetty/p/4769279.html
* 7za命令行 :https://www.mankier.com/1/7za //当rar解压失败时尝试调用系统内置7za解压; 支持大于60G文件
*/
class kodRarArchive {
static function bin($type){
$file = dirname(__FILE__).'/bin/'.$type;
$file = str_replace('\\','/',$file);
if(PHP_OS == "Darwin"){//mac
$file = PLUGIN_DIR.'/zipView/lib/bin/'.$type.'_mac';
}
if(!file_exists($file)){
show_json('bin file not exists!',false);
}
if(PATH_SEPARATOR == ':') {
@chmod($file,0777);
}
return $file;
}
static function run($cmd){
if (strtoupper(substr(PHP_OS, 0,3)) != 'WIN') {//linux
$cmd = "export LANG='en_US.UTF-8' && ".$cmd;
@setlocale(LC_ALL,'en_US.UTF-8');
@putenv('LC_ALL=en_US.UTF-8');
}
$result = shell_exec($cmd);
//debug_out($cmd,$result);
if(!strstr($result,'Copyright')){
return array('code'=>false,'data'=>'[shell_exec error!] No Result!');
}
return array('code'=>true,'data'=>$result);
}
/**
* 防止通过构造文件名,进行shell注入
*/
static function extract($file,$dest,$ext,$partName=false,$passwd=false) {
$dest_before = $dest;
$dest = TEMP_PATH.'archivePreview/'.md5(rand_string(40).time()).'/';
mk_dir($dest);touch(TEMP_PATH.'archivePreview/index.html');
$passwd = $passwd ?" -p".escapeShell($passwd).' ':'';
if($ext == 'rar'){
$param = ' -y '.$passwd.escapeShell($file).' '.escapeShell($dest).' ';
if($partName === false){
$command = self::bin('rar').' x'.$param;
}else if(is_array($partName)){
$command = self::bin('rar').' x'.$param.escapeShell($partName[0]);
}else{
$command = self::bin('rar').' e'.$param.escapeShell($partName);
}
}else{
if($ext == 'bz2'){
$ext = 'bzip2';
}
$param = ' -y -t'.escapeShell($ext).$passwd.' -o'.escapeShell($dest).' '.escapeShell($file).' ';
if($partName === false){
$command = self::bin('7z').' x'.$param;
}else if(is_array($partName)){
$command = self::bin('7z').' x'.$param.escapeShell($partName[0]);
}else{
$command = self::bin('7z').' e'.$param.escapeShell($partName);
}
}
$result = self::run($command);
//7za 兼容 rar解压大文件
if(strstr($result['data'],'is not RAR archive') && shell_exec('7za')){
$param = ' -y -o'.escapeShell($dest).' '.escapeShell($file).' ';
if($partName === false){
$command = '7za x'.$param;
}else if(is_array($partName)){
$command = '7za x'.$param.escapeShell($partName[0]);
}else{
$command = '7za e'.$param.escapeShell($partName);
}
$result = self::run($command);
}
//echo "<pre>";var_dump($result,$command);exit;
if(!$result['code']){
return $result;
}
//子目录解压移除多余层级目录
if( is_array($partName) ){
$thePath = trim(str_replace("\\",'/',$partName[0]),'/');
$pathGroup = explode('/',$thePath);
//一级目录解压不用移动
if(count($pathGroup) > 1){
move_path($dest.$partName[0],$dest.get_path_this($thePath));
del_dir($dest.$pathGroup[0]);
}else{
$dest_before = get_path_father($dest_before);
}
}
//扩展名处理;文件名重命名处理
$arr = dir_list($dest);
foreach($arr as $f){
$itemPath = str_replace(array($dest,"\\"),array('','/'),$f);
$itemPath = unzip_pre_name($itemPath);
$from = $dest.get_path_father($itemPath).get_path_this($f);
if(strstr($itemPath,'/') == false){
$from = $dest.get_path_this($f);
}
if($dest.$itemPath != $from){
@rename($from,$dest.$itemPath);
}
}
move_path($dest,$dest_before);
del_dir(rtrim($dest,'/'));
return $result;
}
static function listContent($file) {
if(get_path_ext($file) == 'rar'){
return self::listContentRar($file);
}else{
return self::listContent7z($file);
}
}
static function listContentRar($file) {
$command = self::bin('rar').' v '.escapeShell($file);
$result = self::run($command);
//7za 兼容 rar解压大文件
if(strstr($result['data'],'is not RAR archive') && shell_exec('7za')){
return self::listContent7z($file,'7za l ');
}
if(!$result['code']){
return $result;
}
preg_match('/-------- ----\n([\d\D]*)\n-----------/i', $result['data'], $match);
if(!is_array($match) || strlen($match[1]) < 10){
return array('code'=>false,'data'=>'Match Nothing Content!');
}
//windows :...D... 93691 82633 88% 2016-12-09 02:20 396CC62C 000/a/32486963.png
//linux: :-rwxr-xr-x 93691 82643 88% 2016-12-09 02:20 396CC62C 000/a/32486963.png
$reg = '/\s*([-\.\w]+)\s+(\d+)\s+(\d+)\s+\d+%|-+>\s+(\d{2,4}-\d{2}-\d{2} \d{2}:\d{2})\s+\w+\s+(.*)\n/i';
preg_match_all($reg,$match[1]."\n",$matchItem);
if( !is_array($matchItem) ||
count($matchItem) != 6 ||
count($matchItem[0]) == 0
){
return array('code'=>false,'data'=>'Match Nothing Item!');
}
$itemArr = array();
for ($i = 0; $i < count($matchItem[0]); $i++) {
$mode = strtoupper($matchItem[1][$i]);
$isFolder = substr($mode,0,1) == 'D' || substr($mode,3,1) == 'D';
$itemArr[] = array(
'mtime' => strtotime($matchItem[4][$i]),
'size' => $matchItem[2][$i],
'z_size' => $matchItem[3][$i],
'filename' => trim($matchItem[5][$i]),
'index' => $i,
'folder' => intval($isFolder)
);
}
//debug_out($result,$match,$matchItem,$itemArr);
return array('code'=>true,'data'=>$itemArr);
}
static function listContent7z($file,$bin=false) {
$command = self::bin('7z').' l '.escapeShell($file);
if($bin){
$command = $bin.escapeShell($file);
}
$result = self::run($command);
if(!$result['code']){
return $result;
}
preg_match('/-----------\n([\d\D]*)\n--------------/i', $result['data'], $match);
if(!is_array($match) || strlen($match[1]) < 10){
return array('code'=>false,'data'=>'Match Nothing Content!');
}
//2017-03-08 11:22:16 ..... 10727 9385 000\test11.docx
//2017-03-09 13:43:10 ....A 6254 000\111.md
$reg = '/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (D?\.+A?)\s+(\d+)\s+(\d*)\s+(.*)/i';
preg_match_all($reg,$match[1],$matchItem);
if( !is_array($matchItem) ||
count($matchItem) != 6 ||
count($matchItem[0]) == 0
){
return array('code'=>false,'data'=>'Match Nothing Item!');
}
$itemArr = array();
for ($i = 0; $i < count($matchItem[0]); $i++) {
$itemArr[] = array(
'mtime' => strtotime($matchItem[1][$i]),
'size' => $matchItem[3][$i],
'z_size' => $matchItem[4][$i],
'filename' => trim($matchItem[5][$i]),
'index' => $i,
'folder' => substr($matchItem[2][$i],0,1) == 'D'
);
}
//debug_out($result,$match,$matchItem,$itemArr);
return array('code'=>true,'data'=>$itemArr);;
}
/**
* [create description]
* @param [type] $file [creat file to]
* @param [type] $ext [ext:7z,xz,bz2,gzip,tar,zip]
* @param [type] $files [array from]
* @param boolean $passwd [password]
* @return [type] [description]
*/
// static function create($file,$files,$ext,$passwd=false) {
// $passwd = $passwd? " -p".$passwd.' ':"";
// $spearat = (PATH_SEPARATOR != ':')?("&& ".substr($files,0,2)." "):"";//win=>; linux=>:
// $command = 'cd "'.$files.'" '.$spearat.' &&';//cd到所在文件夹;
// $command = $command.self::bin().' a -r -y -t'.$ext.' '.$passwd.' "'.$file.'" *';
// return self::run($command);
// }
}
// 不允许双引号
function escapeShell($param){
return escapeshellarg($param);
//$param = escapeshellarg($param);
$os = strtoupper(substr(PHP_OS, 0,3));
if ( $os != 'WIN' && $os != 'DAR') {//linux
$param = str_replace('!','\!',$param);
}
$param = rtrim($param,"\\");
return '"'.str_replace(array('"',"\0",'`'),'_',$param).'"';
}
@@ -0,0 +1,147 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
// ZipArchive 解压缩
class kodZipArchive{
static $listCache = array();
static function support($type=''){
$result = false;
if($type == 'extract' && defined("ZIP_ARCHIVE_LOCAL")){// 只允许创建压缩文件用系统调用
$result = true;
}
if(!class_exists('ZipArchive')){
$result = false;
}
return $result;
}
static function listContent($file){
$file_hash = hash_path($file);
if(isset(self::$listCache[$file_hash])){
return self::$listCache[$file_hash];
}
$zip = new ZipArchive();
$zip->open($file);
$count = $zip->numFiles;
for ($i = 0; $i < $count; $i++) {
$entry = $zip->statIndex($i);
$filename = str_replace('\\', '/', $entry['name']);
$result[] = array(
'filename' => $entry['name'],
'stored_filename' => $entry['name'],
'size' => $entry['size'],
'compressed_size' => $entry['comp_size'],
'mtime' => $entry['mtime'],
'index' => $i,
'folder' => (substr($entry['name'], -1, 1) == '/'),
'crc' => $entry['crc']
);
}
self::$listCache[$file_hash] = $result;
return $result;
}
/**
* [extract description]
* @param [type] $file [archive file]
* @param [type] $dest [extract to folder]
* @param string $part [archive file content]
* @return [type] [array]
*/
static function extract($file,$dest,$partName=false) {
$dest_before = $dest;
$dest = TEMP_PATH.'archivePreview/'.md5(rand_string(40).time()).'/';
mk_dir($dest);touch(TEMP_PATH.'archivePreview/index.html');
$zip = new ZipArchive();
if(!$zip->open($file)){
return array('code'=>false,'data'=>'Can not open zip file!');
}
if($partName === false){
$result = $zip->extractTo($dest);
}else{
if(!is_array($partName)){
$partName = array($partName);
}
$matchFiles = $partName;
//解压文件夹
if(substr($partName[0], -1, 1) == '/'){
$matchFiles = array();
$list = self::listContent($file);
foreach ($list as $item) {
if ( strpos($item['filename'],$partName[0]) === 0 ) {
$matchFiles[] = $item['filename'];
}
}
}
$result = $zip->extractTo($dest,$matchFiles);
}
$zip->close();
//子目录解压移除多余层级目录
if( is_array($partName) ){
$thePath = trim(str_replace("\\",'/',$partName[0]),'/');
$pathGroup = explode('/',$thePath);
//一级目录解压不用移动
if(count($pathGroup) > 1){
move_path($dest.$partName[0],$dest.get_path_this($thePath));
del_dir($dest.$pathGroup[0]);
}else{
$dest_before = get_path_father($dest_before);
}
}
//扩展名处理;文件名重命名处理
$arr = dir_list($dest);
foreach($arr as $f){
$itemPath = str_replace(array($dest,"\\"),array('','/'),$f);
$itemPath = unzip_pre_name($itemPath);
$from = $dest.get_path_father($itemPath).get_path_this($f);
if(strstr($itemPath,'/') == false){
$from = $dest.get_path_this($f);
}
if($dest.$itemPath != $from){
@rename($from,$dest.$itemPath);
}
}
move_path($dest,$dest_before);
del_dir(rtrim($dest,'/'));
return array('code'=>$result,'data'=>$result);
}
/**
* [create description]
* @param [type] $file [creat file to]
* @param [type] $files [array from]
* @return [type] [description]
*/
static function create($file,$files) {
$zip = new ZipArchive();
if(!$zip->open($file, ZipArchive::CREATE)){
return false;//Can not open(create) zip file!'
}
foreach ($files as $key =>$val) {
$val = str_replace(array('//','\\'),'/',$val);
$removePathPre = _DIR_CLEAR(get_path_father($val));
$list = array($val);
if(is_dir($val)){
$list = dir_list($val);
$list[] = $val;
}
foreach ($list as $item) {
$addName = zip_pre_name(str_replace($removePathPre,'',$item));
if(is_dir($item)){
$result = $zip->addEmptyDir($addName);
}else{
$result = $zip->addFile($item,$addName);
}
}
}
$zip->close();
return $result;
}
}
@@ -0,0 +1,132 @@
<?php
// --------------------------------------------------------------------------------
// PhpConcept Library (PCL) Error 1.0
// --------------------------------------------------------------------------------
// License GNU/GPL - Vincent Blavet - Mars 2001
// http://www.phpconcept.net & http://phpconcept.free.fr
// --------------------------------------------------------------------------------
// Français :
// La description de l'usage de la librairie PCL Error 1.0 n'est pas encore
// disponible. Celle-ci n'est pour le moment distribuée qu'avec les
// développements applicatifs de PhpConcept.
// Une version indépendante sera bientot disponible sur http://www.phpconcept.net
//
// English :
// The PCL Error 1.0 library description is not available yet. This library is
// released only with PhpConcept application and libraries.
// An independant release will be soon available on http://www.phpconcept.net
//
// --------------------------------------------------------------------------------
//
// * Avertissement :
//
// Cette librairie a été créée de façon non professionnelle.
// Son usage est au risque et péril de celui qui l'utilise, en aucun cas l'auteur
// de ce code ne pourra être tenu pour responsable des éventuels dégats qu'il pourrait
// engendrer.
// Il est entendu cependant que l'auteur a réalisé ce code par plaisir et n'y a
// caché aucun virus, ni malveillance.
// Cette libairie est distribuée sous la license GNU/GPL (http://www.gnu.org)
//
// * Auteur :
//
// Ce code a été écrit par Vincent Blavet (vincent@blavet.net) sur son temps
// de loisir.
//
// --------------------------------------------------------------------------------
// ----- Look for double include
if (!defined("PCLERROR_LIB"))
{
define( "PCLERROR_LIB", 1 );
// ----- Version
$g_pcl_error_version = "1.0";
// ----- Internal variables
// These values must only be change by PclError library functions
$g_pcl_error_string = "";
$g_pcl_error_code = 1;
// --------------------------------------------------------------------------------
// Function : PclErrorLog()
// Description :
// Parameters :
// --------------------------------------------------------------------------------
function PclErrorLog($p_error_code=0, $p_error_string="")
{
global $g_pcl_error_string;
global $g_pcl_error_code;
$g_pcl_error_code = $p_error_code;
$g_pcl_error_string = $p_error_string;
}
// --------------------------------------------------------------------------------
// --------------------------------------------------------------------------------
// Function : PclErrorFatal()
// Description :
// Parameters :
// --------------------------------------------------------------------------------
function PclErrorFatal($p_file, $p_line, $p_error_string="")
{
global $g_pcl_error_string;
global $g_pcl_error_code;
$v_message = "<html><body>";
$v_message .= "<p align=center><font color=red bgcolor=white><b>PclError Library has detected a fatal error on file '$p_file', line $p_line</b></font></p>";
$v_message .= "<p align=center><font color=red bgcolor=white><b>$p_error_string</b></font></p>";
$v_message .= "</body></html>";
die($v_message);
}
// --------------------------------------------------------------------------------
// --------------------------------------------------------------------------------
// Function : PclErrorReset()
// Description :
// Parameters :
// --------------------------------------------------------------------------------
function PclErrorReset()
{
global $g_pcl_error_string;
global $g_pcl_error_code;
$g_pcl_error_code = 1;
$g_pcl_error_string = "";
}
// --------------------------------------------------------------------------------
// --------------------------------------------------------------------------------
// Function : PclErrorCode()
// Description :
// Parameters :
// --------------------------------------------------------------------------------
function PclErrorCode()
{
global $g_pcl_error_string;
global $g_pcl_error_code;
return($g_pcl_error_code);
}
// --------------------------------------------------------------------------------
// --------------------------------------------------------------------------------
// Function : PclErrorString()
// Description :
// Parameters :
// --------------------------------------------------------------------------------
function PclErrorString()
{
global $g_pcl_error_string;
global $g_pcl_error_code;
return($g_pcl_error_string." [code $g_pcl_error_code]");
}
// --------------------------------------------------------------------------------
// ----- End of double include look
}
?>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,453 @@
<?php
// --------------------------------------------------------------------------------
// PhpConcept Library (PCL) Trace 1.0
// --------------------------------------------------------------------------------
// License GNU/GPL - Vincent Blavet - Janvier 2001
// http://www.phpconcept.net & http://phpconcept.free.fr
// --------------------------------------------------------------------------------
// Français :
// La description de l'usage de la librairie PCL Trace 1.0 n'est pas encore
// disponible. Celle-ci n'est pour le moment distribuée qu'avec l'application
// et la librairie PhpZip.
// Une version indépendante sera bientot disponible sur http://www.phpconcept.net
//
// English :
// The PCL Trace 1.0 library description is not available yet. This library is
// released only with PhpZip application and library.
// An independant release will be soon available on http://www.phpconcept.net
//
// --------------------------------------------------------------------------------
//
// * Avertissement :
//
// Cette librairie a été créée de façon non professionnelle.
// Son usage est au risque et péril de celui qui l'utilise, en aucun cas l'auteur
// de ce code ne pourra être tenu pour responsable des éventuels dégats qu'il pourrait
// engendrer.
// Il est entendu cependant que l'auteur a réalisé ce code par plaisir et n'y a
// caché aucun virus, ni malveillance.
// Cette libairie est distribuée sous la license GNU/GPL (http://www.gnu.org)
//
// * Auteur :
//
// Ce code a été écrit par Vincent Blavet (vincent@blavet.net) sur son temps
// de loisir.
//
// --------------------------------------------------------------------------------
// ----- Look for double include
if (!defined("PCLTRACE_LIB"))
{
define( "PCLTRACE_LIB", 1 );
// ----- Version
$g_pcl_trace_version = "1.0";
// ----- Internal variables
// These values must be change by PclTrace library functions
$g_pcl_trace_mode = "memory";
$g_pcl_trace_filename = "trace.txt";
$g_pcl_trace_name = array();
$g_pcl_trace_index = 0;
$g_pcl_trace_level = 10;
$g_pcl_trace_entries = array();
// --------------------------------------------------------------------------------
// Function : TrOn($p_level, $p_mode, $p_filename)
// Description :
// Parameters :
// $p_level : Trace level
// $p_mode : Mode of trace displaying :
// 'normal' : messages are displayed at function call
// 'memory' : messages are memorized in a table and can be display by
// TrDisplay() function. (default)
// 'log' : messages are writed in the file $p_filename
// --------------------------------------------------------------------------------
function TrOn($p_level=1, $p_mode="memory", $p_filename="trace.txt")
{
global $g_pcl_trace_level;
global $g_pcl_trace_mode;
global $g_pcl_trace_filename;
global $g_pcl_trace_name;
global $g_pcl_trace_index;
global $g_pcl_trace_entries;
// ----- Enable trace mode
$g_pcl_trace_level = $p_level;
// ----- Memorize mode and filename
switch ($p_mode) {
case "normal" :
case "memory" :
case "log" :
$g_pcl_trace_mode = $p_mode;
break;
default :
$g_pcl_trace_mode = "logged";
}
// ----- Memorize filename
$g_pcl_trace_filename = $p_filename;
}
// --------------------------------------------------------------------------------
// --------------------------------------------------------------------------------
// Function : IsTrOn()
// Description :
// Return value :
// The trace level (0 for disable).
// --------------------------------------------------------------------------------
function IsTrOn()
{
global $g_pcl_trace_level;
return($g_pcl_trace_level);
}
// --------------------------------------------------------------------------------
// --------------------------------------------------------------------------------
// Function : TrOff()
// Description :
// Parameters :
// --------------------------------------------------------------------------------
function TrOff()
{
global $g_pcl_trace_level;
global $g_pcl_trace_mode;
global $g_pcl_trace_filename;
global $g_pcl_trace_name;
global $g_pcl_trace_index;
// ----- Clean
$g_pcl_trace_mode = "memory";
unset($g_pcl_trace_entries);
unset($g_pcl_trace_name);
unset($g_pcl_trace_index);
// ----- Switch off trace
$g_pcl_trace_level = 0;
}
// --------------------------------------------------------------------------------
// --------------------------------------------------------------------------------
// Function : TrFctStart()
// Description :
// Just a trace function for debbugging purpose before I use a better tool !!!!
// Start and stop of this function is by $g_pcl_trace_level global variable.
// Parameters :
// $p_level : Level of trace required.
// --------------------------------------------------------------------------------
function TrFctStart($p_file, $p_line, $p_name, $p_param="", $p_message="")
{
global $g_pcl_trace_level;
global $g_pcl_trace_mode;
global $g_pcl_trace_filename;
global $g_pcl_trace_name;
global $g_pcl_trace_index;
global $g_pcl_trace_entries;
// ----- Look for disabled trace
if ($g_pcl_trace_level < 1)
return;
// ----- Add the function name in the list
if (!isset($g_pcl_trace_name))
$g_pcl_trace_name = $p_name;
else
$g_pcl_trace_name .= ",".$p_name;
// ----- Update the function entry
$i = sizeof($g_pcl_trace_entries);
$g_pcl_trace_entries[$i][name] = $p_name;
$g_pcl_trace_entries[$i][param] = $p_param;
$g_pcl_trace_entries[$i][message] = "";
$g_pcl_trace_entries[$i][file] = $p_file;
$g_pcl_trace_entries[$i][line] = $p_line;
$g_pcl_trace_entries[$i][index] = $g_pcl_trace_index;
$g_pcl_trace_entries[$i][type] = "1"; // means start of function
// ----- Update the message entry
if ($p_message != "")
{
$i = sizeof($g_pcl_trace_entries);
$g_pcl_trace_entries[$i][name] = "";
$g_pcl_trace_entries[$i][param] = "";
$g_pcl_trace_entries[$i][message] = $p_message;
$g_pcl_trace_entries[$i][file] = $p_file;
$g_pcl_trace_entries[$i][line] = $p_line;
$g_pcl_trace_entries[$i][index] = $g_pcl_trace_index;
$g_pcl_trace_entries[$i][type] = "3"; // means message
}
// ----- Action depending on mode
PclTraceAction($g_pcl_trace_entries[$i]);
// ----- Increment the index
$g_pcl_trace_index++;
}
// --------------------------------------------------------------------------------
// --------------------------------------------------------------------------------
// Function : TrFctEnd()
// Description :
// Just a trace function for debbugging purpose before I use a better tool !!!!
// Start and stop of this function is by $g_pcl_trace_level global variable.
// Parameters :
// $p_level : Level of trace required.
// --------------------------------------------------------------------------------
function TrFctEnd($p_file, $p_line, $p_return=1, $p_message="")
{
global $g_pcl_trace_level;
global $g_pcl_trace_mode;
global $g_pcl_trace_filename;
global $g_pcl_trace_name;
global $g_pcl_trace_index;
global $g_pcl_trace_entries;
// ----- Look for disabled trace
if ($g_pcl_trace_level < 1)
return;
// ----- Extract the function name in the list
// ----- Remove the function name in the list
if (!($v_name = strrchr($g_pcl_trace_name, ",")))
{
$v_name = $g_pcl_trace_name;
$g_pcl_trace_name = "";
}
else
{
$g_pcl_trace_name = substr($g_pcl_trace_name, 0, strlen($g_pcl_trace_name)-strlen($v_name));
$v_name = substr($v_name, -strlen($v_name)+1);
}
// ----- Decrement the index
$g_pcl_trace_index--;
// ----- Update the message entry
if ($p_message != "")
{
$i = sizeof($g_pcl_trace_entries);
$g_pcl_trace_entries[$i][name] = "";
$g_pcl_trace_entries[$i][param] = "";
$g_pcl_trace_entries[$i][message] = $p_message;
$g_pcl_trace_entries[$i][file] = $p_file;
$g_pcl_trace_entries[$i][line] = $p_line;
$g_pcl_trace_entries[$i][index] = $g_pcl_trace_index;
$g_pcl_trace_entries[$i][type] = "3"; // means message
}
// ----- Update the function entry
$i = sizeof($g_pcl_trace_entries);
$g_pcl_trace_entries[$i][name] = $v_name;
$g_pcl_trace_entries[$i][param] = $p_return;
$g_pcl_trace_entries[$i][message] = "";
$g_pcl_trace_entries[$i][file] = $p_file;
$g_pcl_trace_entries[$i][line] = $p_line;
$g_pcl_trace_entries[$i][index] = $g_pcl_trace_index;
$g_pcl_trace_entries[$i][type] = "2"; // means end of function
// ----- Action depending on mode
PclTraceAction($g_pcl_trace_entries[$i]);
}
// --------------------------------------------------------------------------------
// --------------------------------------------------------------------------------
// Function : TrFctMessage()
// Description :
// Parameters :
// --------------------------------------------------------------------------------
function TrFctMessage($p_file, $p_line, $p_level, $p_message="")
{
global $g_pcl_trace_level;
global $g_pcl_trace_mode;
global $g_pcl_trace_filename;
global $g_pcl_trace_name;
global $g_pcl_trace_index;
global $g_pcl_trace_entries;
// ----- Look for disabled trace
if ($g_pcl_trace_level < $p_level)
return;
// ----- Update the entry
$i = sizeof($g_pcl_trace_entries);
$g_pcl_trace_entries[$i][name] = "";
$g_pcl_trace_entries[$i][param] = "";
$g_pcl_trace_entries[$i][message] = $p_message;
$g_pcl_trace_entries[$i][file] = $p_file;
$g_pcl_trace_entries[$i][line] = $p_line;
$g_pcl_trace_entries[$i][index] = $g_pcl_trace_index;
$g_pcl_trace_entries[$i][type] = "3"; // means message of function
// ----- Action depending on mode
PclTraceAction($g_pcl_trace_entries[$i]);
}
// --------------------------------------------------------------------------------
// --------------------------------------------------------------------------------
// Function : TrMessage()
// Description :
// Parameters :
// --------------------------------------------------------------------------------
function TrMessage($p_file, $p_line, $p_level, $p_message="")
{
global $g_pcl_trace_level;
global $g_pcl_trace_mode;
global $g_pcl_trace_filename;
global $g_pcl_trace_name;
global $g_pcl_trace_index;
global $g_pcl_trace_entries;
// ----- Look for disabled trace
if ($g_pcl_trace_level < $p_level)
return;
// ----- Update the entry
$i = sizeof($g_pcl_trace_entries);
$g_pcl_trace_entries[$i][name] = "";
$g_pcl_trace_entries[$i][param] = "";
$g_pcl_trace_entries[$i][message] = $p_message;
$g_pcl_trace_entries[$i][file] = $p_file;
$g_pcl_trace_entries[$i][line] = $p_line;
$g_pcl_trace_entries[$i][index] = $g_pcl_trace_index;
$g_pcl_trace_entries[$i][type] = "4"; // means simple message
// ----- Action depending on mode
PclTraceAction($g_pcl_trace_entries[$i]);
}
// --------------------------------------------------------------------------------
// --------------------------------------------------------------------------------
// Function : TrDisplay()
// Description :
// Parameters :
// --------------------------------------------------------------------------------
function TrDisplay()
{
global $g_pcl_trace_level;
global $g_pcl_trace_mode;
global $g_pcl_trace_filename;
global $g_pcl_trace_name;
global $g_pcl_trace_index;
global $g_pcl_trace_entries;
// ----- Look for disabled trace
if (($g_pcl_trace_level <= 0) || ($g_pcl_trace_mode != "memory"))
return;
$v_font = "\"Verdana, Arial, Helvetica, sans-serif\"";
// ----- Trace Header
echo "<table width=100% border=0 cellspacing=0 cellpadding=0>";
echo "<tr bgcolor=#0000CC>";
echo "<td bgcolor=#0000CC width=1>";
echo "</td>";
echo "<td><div align=center><font size=3 color=#FFFFFF face=$v_font>Trace</font></div></td>";
echo "</tr>";
echo "<tr>";
echo "<td bgcolor=#0000CC width=1>";
echo "</td>";
echo "<td>";
// ----- Content header
echo "<table width=100% border=0 cellspacing=0 cellpadding=0>";
// ----- Display
$v_again=0;
for ($i=0; $i<sizeof($g_pcl_trace_entries); $i++)
{
// ---- Row header
echo "<tr>";
echo "<td><table width=100% border=0 cellspacing=0 cellpadding=0><tr>";
$n = ($g_pcl_trace_entries[$i][index]+1)*10;
echo "<td width=".$n."><table width=100% border=0 cellspacing=0 cellpadding=0><tr>";
for ($j=0; $j<=$g_pcl_trace_entries[$i][index]; $j++)
{
if ($j==$g_pcl_trace_entries[$i][index])
{
if (($g_pcl_trace_entries[$i][type] == 1) || ($g_pcl_trace_entries[$i][type] == 2))
echo "<td width=10><div align=center><font size=2 face=$v_font>+</font></div></td>";
}
else
echo "<td width=10><div align=center><font size=2 face=$v_font>|</font></div></td>";
}
//echo "<td>&nbsp</td>";
echo "</tr></table></td>";
echo "<td width=2></td>";
switch ($g_pcl_trace_entries[$i][type]) {
case 1:
echo "<td><font size=2 face=$v_font>".$g_pcl_trace_entries[$i][name]."(".$g_pcl_trace_entries[$i][param].")</font></td>";
break;
case 2:
echo "<td><font size=2 face=$v_font>".$g_pcl_trace_entries[$i][name]."()=".$g_pcl_trace_entries[$i][param]."</font></td>";
break;
case 3:
case 4:
echo "<td><table width=100% border=0 cellspacing=0 cellpadding=0><td width=20></td><td>";
echo "<font size=2 face=$v_font>".$g_pcl_trace_entries[$i][message]."</font>";
echo "</td></table></td>";
break;
default:
echo "<td><font size=2 face=$v_font>".$g_pcl_trace_entries[$i][name]."(".$g_pcl_trace_entries[$i][param].")</font></td>";
}
echo "</tr></table></td>";
echo "<td width=5></td>";
echo "<td><font size=1 face=$v_font>".basename($g_pcl_trace_entries[$i][file])."</font></td>";
echo "<td width=5></td>";
echo "<td><font size=1 face=$v_font>".$g_pcl_trace_entries[$i][line]."</font></td>";
echo "</tr>";
}
// ----- Content footer
echo "</table>";
// ----- Trace footer
echo "</td>";
echo "<td bgcolor=#0000CC width=1>";
echo "</td>";
echo "</tr>";
echo "<tr bgcolor=#0000CC>";
echo "<td bgcolor=#0000CC width=1>";
echo "</td>";
echo "<td><div align=center><font color=#FFFFFF face=$v_font>&nbsp</font></div></td>";
echo "</tr>";
echo "</table>";
}
// --------------------------------------------------------------------------------
// --------------------------------------------------------------------------------
// Function : PclTraceAction()
// Description :
// Parameters :
// --------------------------------------------------------------------------------
function PclTraceAction($p_entry)
{
global $g_pcl_trace_level;
global $g_pcl_trace_mode;
global $g_pcl_trace_filename;
global $g_pcl_trace_name;
global $g_pcl_trace_index;
global $g_pcl_trace_entries;
if ($g_pcl_trace_mode == "normal")
{
for ($i=0; $i<$p_entry[index]; $i++)
echo "---";
if ($p_entry[type] == 1)
echo "<b>".$p_entry[name]."</b>(".$p_entry[param].") : ".$p_entry[message]." [".$p_entry[file].", ".$p_entry[line]."]<br>";
else if ($p_entry[type] == 2)
echo "<b>".$p_entry[name]."</b>()=".$p_entry[param]." : ".$p_entry[message]." [".$p_entry[file].", ".$p_entry[line]."]<br>";
else
echo $p_entry[message]." [".$p_entry[file].", ".$p_entry[line]."]<br>";
}
}
// --------------------------------------------------------------------------------
// ----- End of double include look
}
File diff suppressed because it is too large Load Diff
+286
View File
@@ -0,0 +1,286 @@
<?php
// from elfinder;
class imageGdBMP{
public static function load($filename){
$fp = fopen($filename, "rb");
if ($fp === false){
return false;
}
$bmp = self::loadFromStream($fp);
fclose($fp);
return $bmp;
}
public static function loadFromStream($stream){
$buf = fread($stream, 14); //2+4+2+2+4
if ($buf === false){
return false;
}
if ($buf[0] != 'B' || $buf[1] != 'M'){
return false;
}
$bitmapHeader = unpack(
"vtype/".
"Vsize/".
"vreserved1/".
"vreserved2/".
"Voffbits", $buf
);
return self::loadFromStreamAndFileHeader($stream, $bitmapHeader);
}
public static function loadFromStreamAndFileHeader($stream, array $bitmapHeader){
if ($bitmapHeader["type"] != 0x4d42){
return false;
}
$buf = fread($stream, 4);
if ($buf === false){
return false;
}
list(,$header_size) = unpack("V", $buf);
if ($header_size == 12){
$buf = fread($stream, $header_size - 4);
if ($buf === false){
return false;
}
extract(unpack(
"vwidth/".
"vheight/".
"vplanes/".
"vbit_count", $buf
));
$clr_used = $clr_important = $alpha_mask = $compression = 0;
$red_mask = 0x00ff0000;
$green_mask = 0x0000ff00;
$blue_mask = 0x000000ff;
} else if (124 < $header_size || $header_size < 40) {
return false;
} else {
$buf = fread($stream, 36);
if ($buf === false){
return false;
}
extract(unpack(
"Vwidth/".
"Vheight/".
"vplanes/".
"vbit_count/".
"Vcompression/".
"Vsize_image/".
"Vx_pels_per_meter/".
"Vy_pels_per_meter/".
"Vclr_used/".
"Vclr_important", $buf
));
if ($width & 0x80000000){ $width = -(~$width & 0xffffffff) - 1; }
if ($height & 0x80000000){ $height = -(~$height & 0xffffffff) - 1; }
if ($x_pels_per_meter & 0x80000000){ $x_pels_per_meter = -(~$x_pels_per_meter & 0xffffffff) - 1; }
if ($y_pels_per_meter & 0x80000000){ $y_pels_per_meter = -(~$y_pels_per_meter & 0xffffffff) - 1; }
if ($bitmapHeader["size"] != 0){
$colorsize = $bit_count == 1 || $bit_count == 4 || $bit_count == 8 ? ($clr_used ? $clr_used : pow(2, $bit_count))<<2 : 0;
$bodysize = $size_image ? $size_image : ((($width * $bit_count + 31) >> 3) & ~3) * abs($height);
$calcsize = $bitmapHeader["size"] - $bodysize - $colorsize - 14;
if ($header_size < $calcsize && 40 <= $header_size && $header_size <= 124){
$header_size = $calcsize;
}
}
if ($header_size - 40 > 0){
$buf = fread($stream, $header_size - 40);
if ($buf === false){
return false;
}
extract(unpack(
"Vred_mask/".
"Vgreen_mask/".
"Vblue_mask/".
"Valpha_mask", $buf . str_repeat("\x00", 120)
));
} else {
$alpha_mask = $red_mask = $green_mask = $blue_mask = 0;
}
if (
($bit_count == 16 || $bit_count == 24 || $bit_count == 32)&&
$compression == 0 &&
$red_mask == 0 && $green_mask == 0 && $blue_mask == 0
){
switch($bit_count){
case 16:
$red_mask = 0x7c00;
$green_mask = 0x03e0;
$blue_mask = 0x001f;
break;
case 24:
case 32:
$red_mask = 0x00ff0000;
$green_mask = 0x0000ff00;
$blue_mask = 0x000000ff;
break;
}
}
}
if (
($width == 0)||
($height == 0)||
($planes != 1)||
(($alpha_mask & $red_mask ) != 0)||
(($alpha_mask & $green_mask) != 0)||
(($alpha_mask & $blue_mask ) != 0)||
(($red_mask & $green_mask) != 0)||
(($red_mask & $blue_mask ) != 0)||
(($green_mask & $blue_mask ) != 0)
){
return false;
}
if ($compression == 4 || $compression == 5){
$buf = stream_get_contents($stream, $size_image);
if ($buf === false){
return false;
}
return imagecreatefromstring($buf);
}
$line_bytes = (($width * $bit_count + 31) >> 3) & ~3;
$lines = abs($height);
$y = $height > 0 ? $lines-1 : 0;
$line_step = $height > 0 ? -1 : 1;
if ($bit_count == 1 || $bit_count == 4 || $bit_count == 8){
$img = imagecreate($width, $lines);
$palette_size = $header_size == 12 ? 3 : 4;
$colors = $clr_used ? $clr_used : pow(2, $bit_count);
$palette = array();
for($i = 0; $i < $colors; ++$i){
$buf = fread($stream, $palette_size);
if ($buf === false){
imagedestroy($img);
return false;
}
extract(unpack("Cb/Cg/Cr/Cx", $buf . "\x00"));
$palette[] = imagecolorallocate($img, $r, $g, $b);
}
$shift_base = 8 - $bit_count;
$mask = ((1 << $bit_count) - 1) << $shift_base;
if ($compression == 1 || $compression == 2){
$x = 0;
$qrt_mod2 = $bit_count >> 2 & 1;
for(;;){
if ($x < -1 || $x > $width || $y < -1 || $y > $height){
imagedestroy($img);
return false;
}
$buf = fread($stream, 1);
if ($buf === false){
imagedestroy($img);
return false;
}
switch($buf){
case "\x00":
$buf = fread($stream, 1);
if ($buf === false){
imagedestroy($img);
return false;
}
switch($buf){
case "\x00": //EOL
$y += $line_step;
$x = 0;
break;
case "\x01": //EOB
$y = 0;
$x = 0;
break 3;
case "\x02": //MOV
$buf = fread($stream, 2);
if ($buf === false){
imagedestroy($img);
return false;
}
list(,$xx, $yy) = unpack("C2", $buf);
$x += $xx;
$y += $yy * $line_step;
break;
default:
list(,$pixels) = unpack("C", $buf);
$bytes = ($pixels >> $qrt_mod2) + ($pixels & $qrt_mod2);
$buf = fread($stream, ($bytes + 1) & ~1);
if ($buf === false){
imagedestroy($img);
return false;
}
for ($i = 0, $pos = 0; $i < $pixels; ++$i, ++$x, $pos += $bit_count){
list(,$c) = unpack("C", $buf[$pos >> 3]);
$b = $pos & 0x07;
imagesetpixel($img, $x, $y, $palette[($c & ($mask >> $b)) >> ($shift_base - $b)]);
}
break;
}
break;
default:
$buf2 = fread($stream, 1);
if ($buf2 === false){
imagedestroy($img);
return false;
}
list(,$size, $c) = unpack("C2", $buf . $buf2);
for($i = 0, $pos = 0; $i < $size; ++$i, ++$x, $pos += $bit_count){
$b = $pos & 0x07;
imagesetpixel($img, $x, $y, $palette[($c & ($mask >> $b)) >> ($shift_base - $b)]);
}
break;
}
}
} else {
for ($line = 0; $line < $lines; ++$line, $y += $line_step){
$buf = fread($stream, $line_bytes);
if ($buf === false){
imagedestroy($img);
return false;
}
$pos = 0;
for ($x = 0; $x < $width; ++$x, $pos += $bit_count){
list(,$c) = unpack("C", $buf[$pos >> 3]);
$b = $pos & 0x7;
imagesetpixel($img, $x, $y, $palette[($c & ($mask >> $b)) >> ($shift_base - $b)]);
}
}
}
} else {
$img = imagecreatetruecolor($width, $lines);
imagealphablending($img, false);
if ($alpha_mask){
imagesavealpha($img, true);
}
//x軸進行量
$pixel_step = $bit_count >> 3;
$alpha_max = $alpha_mask ? 0x7f : 0x00;
$alpha_mask_r = $alpha_mask ? 1/$alpha_mask : 1;
$red_mask_r = $red_mask ? 1/$red_mask : 1;
$green_mask_r = $green_mask ? 1/$green_mask : 1;
$blue_mask_r = $blue_mask ? 1/$blue_mask : 1;
for ($line = 0; $line < $lines; ++$line, $y += $line_step){
$buf = fread($stream, $line_bytes);
if ($buf === false){
imagedestroy($img);
return false;
}
$pos = 0;
for ($x = 0; $x < $width; ++$x, $pos += $pixel_step){
list(,$c) = unpack("V", substr($buf, $pos, $pixel_step). "\x00\x00");
$a_masked = $c & $alpha_mask;
$r_masked = $c & $red_mask;
$g_masked = $c & $green_mask;
$b_masked = $c & $blue_mask;
$a = $alpha_max - ((($a_masked<<7) - $a_masked) * $alpha_mask_r);
$r = (($r_masked<<8) - $r_masked) * $red_mask_r;
$g = (($g_masked<<8) - $g_masked) * $green_mask_r;
$b = (($b_masked<<8) - $b_masked) * $blue_mask_r;
imagesetpixel($img, $x, $y, ($a<<24)|($r<<16)|($g<<8)|$b);
}
}
imagealphablending($img, true);
}
return $img;
}
}
@@ -0,0 +1,4 @@
<?php
class ConfigModel extends Model{
}
@@ -0,0 +1,191 @@
<?php
class pluginModel{
var $in;
var $config;
function __construct(){
global $config, $in;
//parent::__construct();
$this -> in = &$in;
$this -> config = &$config;
}
public function loadData(){
if(!isset($this->config['settingSystem']['pluginList'])){
$this->config['settingSystem']['pluginList'] = array();
$this->initDefaultPlugin();//首次,加载并开启默认插件
}
return $this->config['settingSystem']['pluginList'];
}
public function saveData(){
$settingFile = USER_SYSTEM.'system_setting.php';
FileCache::save($settingFile,$this->config['settingSystem']);
}
private function initDefaultPlugin(){
$this->pluginScan();
$list = $this->loadData();
foreach ($list as $app => $val) {
$this->changeStatus($app,1);
}
}
/**
* 加载所有插件hook;
*/
public function init(){
$pluginList = $this->loadData();
foreach ($pluginList as $key=>$item) {
if(!is_array($item) && isset($item['id'])){
continue;
}
$file = PLUGIN_DIR.$item['id'].'/app.php';
if( !$item['status'] || !is_file($file)) {
continue;
}
if(!$this->checkAuth($item['id'])){
continue;
}
foreach ($item['regiest'] as $tag => $action) {
Hook::bind($tag,$action);
}
}
//执行全局插件绑定
Hook::trigger("globalRequest");
Hook::trigger(ST.'.'.ACT);
}
public function checkAuth($app){
$pluginList = $this->loadData();
if( !isset($pluginList[$app]) ||
!$pluginList[$app]['status']){
show_tips("Not exist or disabled!");
}
if( !isset($pluginList[$app]['config']['pluginAuth']) ){
return true;
}
$auth = $pluginList[$app]['config']['pluginAuth'];
if(plugin_check_auth($app,$auth)){
return true;
}else{
return false;
}
}
public function add($app){
if( !file_exists(PLUGIN_DIR.$app.'/package.json') ||
!file_exists(PLUGIN_DIR.$app.'/app.php')){
return;
}
Hook::apply($app.'Plugin.regiest');
$this->saveData();
}
public function remove($app){
$pluginList = &$this->config['settingSystem']['pluginList'];
unset($pluginList[$app]);
if( file_exists(PLUGIN_DIR.$app)){
Hook::apply($app.'Plugin.unInstall');
}
$this->saveData();
return true;
}
/**
* 切换插件启用关闭状态
* @param [type] $app 插件名
* @param [type] $open 开关状态 0-禁用;1-启用
* @return
*/
public function changeStatus($app,$open){
$pluginList = &$this->config['settingSystem']['pluginList'];
if(is_array($pluginList[$app])){
if($open){
$config = $this->getConfig($app);
$default = $this->getConfigDefault($app);
$config = array_merge($default,$config);//保存初始配置;兼容新增默认配置
Hook::apply($app.'Plugin.regiest');
$this->setConfig($app,$config);
}
$pluginList[$app]['status'] = $open;
}
$this->saveData();
}
public function getConfigDefault($app){
$result = array();
$json = $this->getPackageJson($app);
if(!$json && is_array($json['configItem'])){
return $result;
}
foreach($json['configItem'] as $key=>$item) {
if(!isset($item['value']) ||
isset($result[$key]) ){
continue;
}
$result[$key] = $item['value'];
}
return $result;
}
public function getPackageJson($app){
return Hook::apply($app.'Plugin.appPackage');
}
public function getConfig($app){
$result = array();
$pluginList = &$this->config['settingSystem']['pluginList'];
if( isset($pluginList[$app]) &&
is_array($pluginList[$app]['config']) ){
$result = $pluginList[$app]['config'];
}
if(!$result){
$result = $this->getConfigDefault($app);
}
return $result;
}
public function setConfig($app,$value){
$pluginList = &$this->config['settingSystem']['pluginList'];
if(isset($pluginList[$app])){
foreach ($value as $key => $val) {
$pluginList[$app]['config'][$key] = $val;
}
}
$this->saveData();
}
/**
* 遍历查检目录;自动加载插件;
* @return [type] [description]
*/
public function pluginScan(){
$pluginList = &$this->config['settingSystem']['pluginList'];
recursion_dir(PLUGIN_DIR,$dirs,$files,0);
foreach ($dirs as $path) {
$app = get_path_this($path);
if(isset($pluginList[$app])){
continue;
}
if( !file_exists($path.'/package.json') ||
!file_exists($path.'/app.php')){
continue;
}
Hook::apply($app.'Plugin.regiest');
}
$this->saveData();
}
public function viewList(){
$this->pluginScan();
$list = $this->loadData();
$result = array();
foreach ($list as $key => $item) {
if(!plugin_check_allow($key)){
continue;
}
unset($item['regiest']);
$package = Hook::apply($item['id'].'Plugin.appPackage');
if(is_array($package)){
$result[$key] = array_merge($item,$package);
}
}
return $result;
}
}
+224
View File
@@ -0,0 +1,224 @@
<?php
class MyCaptcha{
var $keystring;
function __construct($length){
$alphabet = "0123456789abcdefghijklmnopqrstuvwxyz"; # do not change without changing font files!
$width = 140;
$height = 60;
$fluctuation_amplitude = $height/10;//上下起伏
$white_noise_density=1/10;//$white_noise_density=0; // no white noise
$black_noise_density=1/100;//$black_noise_density=0; // no black noise
$foreground_color = array(mt_rand(0,120), mt_rand(0,120), mt_rand(0,120));
$background_color = array(mt_rand(220,255), mt_rand(220,255), mt_rand(220,255));
$font_path = dirname(__FILE__).'/MyCaptcha_fonts/';
$fonts=array($font_path.'font_1.png',$font_path.'font_2.png',$font_path.'font_3.png');
$alphabet_length=strlen($alphabet);
do{
$this->keystring = $this->randString($length);
$font_file=$fonts[mt_rand(0, count($fonts)-1)];
$font=imagecreatefrompng($font_file);
imagealphablending($font, true);
$fontfile_width=imagesx($font);
$fontfile_height=imagesy($font)-1;
$font_metrics=array();
$symbol=0;
$reading_symbol=false;
// loading font
for($i=0;$i<$fontfile_width && $symbol<$alphabet_length;$i++){
$transparent = (imagecolorat($font, $i, 0) >> 24) == 127;
if(!$reading_symbol && !$transparent){
$font_metrics[$alphabet{$symbol}]=array('start'=>$i);
$reading_symbol=true;
continue;
}
if($reading_symbol && $transparent){
$font_metrics[$alphabet{$symbol}]['end']=$i;
$reading_symbol=false;
$symbol++;
continue;
}
}
$img=imagecreatetruecolor($width, $height);
imagealphablending($img, true);
$white=imagecolorallocate($img, 255, 255, 255);
$black=imagecolorallocate($img, 0, 0, 0);
imagefilledrectangle($img, 0, 0, $width-1, $height-1, $white);
$x=1;
$odd=mt_rand(0,1);
if($odd==0) $odd=-1;
for($i=0;$i<$length;$i++){
$m=$font_metrics[$this->keystring{$i}];
$y=(($i%2)*$fluctuation_amplitude - $fluctuation_amplitude/2)*$odd
+ mt_rand(-round($fluctuation_amplitude/3), round($fluctuation_amplitude/3))
+ ($height-$fontfile_height)/2;
$shift=1;
imagecopy($img, $font, $x-$shift, $y, $m['start'], 1, $m['end']-$m['start'], $fontfile_height);
$x+=$m['end']-$m['start']-$shift;
}
}while($x>=$width-10); // while not fit in canvas
//noise
$white=imagecolorallocate($font, 255, 255, 255);
$black=imagecolorallocate($font, 0, 0, 0);
for($i=0;$i<(($height-30)*$x)*$white_noise_density;$i++){
imagesetpixel($img, mt_rand(0, $x-1), mt_rand(10, $height-15), $white);
}
for($i=0;$i<(($height-30)*$x)*$black_noise_density;$i++){
imagesetpixel($img, mt_rand(0, $x-1), mt_rand(10, $height-15), $black);
}
$center=$x/2;
// credits. To remove, see configuration file
$img2=imagecreatetruecolor($width, $height);
$foreground=imagecolorallocate($img2, $foreground_color[0], $foreground_color[1], $foreground_color[2]);
$background=imagecolorallocate($img2, $background_color[0], $background_color[1], $background_color[2]);
imagefilledrectangle($img2, 0, 0, $width-1, $height-1, $background);
imagefilledrectangle($img2, 0, $height, $width-1, $height+12, $foreground);
$this->drawLine($img2,$width,$height);
// periods
$rand1=mt_rand(750000,1200000)/10000000;
$rand2=mt_rand(750000,1200000)/10000000;
$rand3=mt_rand(750000,1200000)/10000000;
$rand4=mt_rand(750000,1200000)/10000000;
// phases
$rand5=mt_rand(0,31415926)/10000000;
$rand6=mt_rand(0,31415926)/10000000;
$rand7=mt_rand(0,31415926)/10000000;
$rand8=mt_rand(0,31415926)/10000000;
// amplitudes
$rand9=mt_rand(330,420)/110;
$rand10=mt_rand(330,450)/100;
//wave distortion
for($x=0;$x<$width;$x++){
for($y=0;$y<$height;$y++){
$sx=$x+(sin($x*$rand1+$rand5)+sin($y*$rand3+$rand6))*$rand9-$width/2+$center+1;
$sy=$y+(sin($x*$rand2+$rand7)+sin($y*$rand4+$rand8))*$rand10;
if($sx<0 || $sy<0 || $sx>=$width-1 || $sy>=$height-1){
continue;
}else{
$color=imagecolorat($img, $sx, $sy) & 0xFF;
$color_x=imagecolorat($img, $sx+1, $sy) & 0xFF;
$color_y=imagecolorat($img, $sx, $sy+1) & 0xFF;
$color_xy=imagecolorat($img, $sx+1, $sy+1) & 0xFF;
}
if($color==255 && $color_x==255 && $color_y==255 && $color_xy==255){
continue;
}else if($color==0 && $color_x==0 && $color_y==0 && $color_xy==0){
$newred=$foreground_color[0];
$newgreen=$foreground_color[1];
$newblue=$foreground_color[2];
}else{
$frsx=$sx-floor($sx);
$frsy=$sy-floor($sy);
$frsx1=1-$frsx;
$frsy1=1-$frsy;
$newcolor=(
$color*$frsx1*$frsy1+
$color_x*$frsx*$frsy1+
$color_y*$frsx1*$frsy+
$color_xy*$frsx*$frsy
);
if($newcolor>255) $newcolor=255;
$newcolor=$newcolor/255;
$newcolor0=1-$newcolor;
$newred=$newcolor0*$foreground_color[0]+$newcolor*$background_color[0];
$newgreen=$newcolor0*$foreground_color[1]+$newcolor*$background_color[1];
$newblue=$newcolor0*$foreground_color[2]+$newcolor*$background_color[2];
}
imagesetpixel($img2, $x, $y, imagecolorallocate($img2, $newred, $newgreen, $newblue));
}
}
$this->showImage($img2);
}
public function getString(){
return $this->keystring;
}
private function randString($length){
$str = '';
$allowed_symbols = "23456789abcdegikpqsvxyz"; //without symbols (o=0, 1=l, i=j, t=f)
while(true){
$str = '';
for($i=0;$i<$length;$i++){
$str .= $allowed_symbols{mt_rand(0,strlen($allowed_symbols)-1)};
}
if(!preg_match('/cp|cb|ck|c6|c9|rn|rm|mm|co|do|cl|db|qp|qb|dp|ww/',$str)) break;
}
return $str;
}
private function frand(){
return mt_rand(0,9999)/10000;
}
private function drawLine(&$img,$width,$height){
$line_number = 5;
$color_from = 100;
for ($line = 0; $line < $line_number; ++ $line) {
$line_color = imagecolorallocate($img, mt_rand($color_from,255),
mt_rand($color_from, 255),mt_rand($color_from, 255));
$x = $width * (1 + $line) / ($line_number + 1);
$x += (0.5 - $this->frand()) * $width / $line_number;
$y = mt_rand($height * 0.1, $height * 0.9);
$theta = ($this->frand() - 0.5) * M_PI * 0.7;
$w = $width;
$len = mt_rand($w * 0.4, $w * 0.7);
$lwid = mt_rand(0, 2);
$k = $this->frand() * 0.6 + 0.2;
$k = $k * $k * 0.5;
$phi = $this->frand() * 6.28;
$step = 0.5;
$dx = $step * cos($theta);
$dy = $step * sin($theta);
$n = $len / $step;
$amp = 1.5 * $this->frand() / ($k + 5.0 / $len);
$x0 = $x - 0.5 * $len * cos($theta);
$y0 = $y - 0.5 * $len * sin($theta);
$ldx = round(- $dy * $lwid);
$ldy = round($dx * $lwid);
for ($i = 0; $i < $n; ++ $i) {
$x = $x0 + $i * $dx + $amp * $dy * sin($k * $i * $step + $phi);
$y = $y0 + $i * $dy - $amp * $dx * sin($k * $i * $step + $phi);
imagefilledrectangle($img, $x, $y, $x + $lwid, $y + $lwid,$line_color);
}
}
$allowed_symbols = "0123456789abcdefghijklmnopqrstuvwxyz";
for ($i = 0; $i < 20; $i++) {//写入随机字串
$char = $allowed_symbols[mt_rand(0,strlen($allowed_symbols)-1)];
$line_color = imagecolorallocate($img,
mt_rand($color_from,255),mt_rand($color_from, 255),mt_rand($color_from, 255));
imagechar($img,mt_rand(0,4),mt_rand(0,$width),rand(0,$height),$char,$line_color);
}
}
private function showImage(&$img){
ob_get_clean();
$out = ob_get_clean();//清除之前所有输出缓冲 TODO
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', FALSE);
header('Pragma: no-cache');
if(function_exists("imagejpeg")){
header("Content-Type: image/jpeg");
imagejpeg($img, null,90);//图片质量
}else if(function_exists("imagegif")){
header("Content-Type: image/gif");
imagegif($img);
}else if(function_exists("imagepng")){
header("Content-Type: image/x-png");
imagepng($img);
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+91
View File
@@ -0,0 +1,91 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta http-equiv="Content-Script-Type" content="text/javascript">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<meta name="renderer" content="webkit">
<link href="<?php echo STATIC_PATH;?>images/common/favicon.ico" rel="Shortcut Icon">
<link href="<?php echo STATIC_PATH;?>style/common.css?ver=<?php echo KOD_VERSION;?>" rel="stylesheet"/>
<link href="./static/style/font-awesome/css/font-awesome.css?ver=<?php echo KOD_VERSION;?>" rel="stylesheet">
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/base/app_explorer.css?ver=<?php echo KOD_VERSION;?>"/>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/win10.css?ver=<?php echo KOD_VERSION;?>"/>
<title>File View</title>
<!--[if IE 7]>
<link rel="stylesheet" href="./static/style/font-awesome/css/font-awesome-ie7.css">
<![endif]-->
</head>
<style type="text/css">
body{background: transparent;}
.frame-main {top: 0;bottom: 0;}
.show-code{width: 100%;left: 0;margin: 0;border: none;padding: 0;}
.content-box{position: absolute;bottom: 0;top: 0;width: 100%;}
.content-box iframe{width: 100%;height: 100%;}
.content-box.markdown-preview {padding: 0;height: 100%;}
.show-code,.show-code .ace_editor{height: 100%;}
.eidior-box{width:100%;height:100%;overflow: hidden;position: relative;}
.eidior-content{position: absolute;top: 0;left: 0;bottom: 0;right: 0;}
.eidior-content .ace_editor{height:100%;}
.content-markdown {overflow: auto;height: 100%;padding: 0 20px;}
.context-menu-list.menu-zip-list-folder{display:none !important;}
.menu-zip-list-file .context-menu-item.unzip-to,
.menu-zip-list-file .context-menu-item.unzip-this,
.menu-zip-list-file .context-menu-item.info,
.menu-zip-list-file .context-menu-item.open-with,
.menu-zip-list-file .context-menu-item.context-menu-separator{display:none !important;}
.ztree li a,.ztree li a:hover,
.ztree li a.curSelectedNode, .ztree li span.name,
.ztree li a.curDropTreeNode{height:30px;line-height:30px;}
.ztree li span.tree_icon {height: 28px;width: 26px;}
.ztree li span.tree_icon .x-item-file{width: 24px;height: 24px;}
.zip-view-dialog .zip-view-content .ztree li a .menu-item-parent{width:30px;height:30px;line-height: 30px;}
</style>
<body>
<div class="full-background"></div>
<div class="init-loading"><div><img src="<?php echo STATIC_PATH;?>images/common/loading_simple.gif?v=<?php echo KOD_VERSION;?>"/></div></div>
<div class="frame-main">
<div class="bindary-box hidden">
<div class="title"><div class="ico"></div></div>
<div class="content-info">
<div class="name"></div>
<div class="size"><span></span><i class="share-time"></i></div>
<div class="btn-group">
<a type="button" class="btn btn-primary btn-download" href=""><?php echo LNG('download');?></a>
</div>
<div class="error-tips"><?php echo LNG('share_error_show_tips');?></div>
</div>
</div>
<div class="content-box"></div>
</div><!-- / frame-main end-->
<script type="text/javascript" src="<?php echo STATIC_PATH;?>js/lib/seajs/sea.js?ver=<?php echo KOD_VERSION;?>"></script>
<script type="text/javascript" src="./index.php?share/commonJs&st=api&act=view#id=<?php echo rand_string(4);?>"></script>
<?php
$path = rawurldecode($_GET['path']);
$name = get_path_this($path);
if(isset($_GET['name'])){$name = rawurldecode($_GET['name']);}
?>
<script type="text/javascript">
G.shareInfo = {
path:"<?php echo clear_html($path);?>",
name:"<?php echo clear_html($name);?>",
mtime:0,size:0
}
<?php if(ST.'.'.ACT == 'explorer.fileView'){echo "G.shareInfo.view = true;G.sharePage=undefined;";}?>
G['accessToken'] = "<?php echo access_token_get();?>";
seajs.config({
base: "<?php echo STATIC_PATH;?>js/",
preload: ["lib/jquery-1.8.0.min",'lib/ace/src-min-noconflict/ace'],
map:[[/^(.*\.(?:css|js|html|htm|json|text))([\?|#].*)$/i,'$1$2?ver='+G.version]]
});
seajs.use("<?php echo STATIC_JS;?>/src/api/view/main");
</script>
</body>
</html>
+33
View File
@@ -0,0 +1,33 @@
<?php include(TEMPLATE.'common/header.html');?>
<title><?php echo strip_tags(LNG('kod_name')).LNG('kod_power_by');?></title>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/base/app_setting.css?ver=<?php echo KOD_VERSION;?>"/>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/<?php echo $config['user']['theme'];?>.css?ver=<?php echo KOD_VERSION;?>" id='link-theme-style'/>
</head>
<body>
<div id="body">
<div class="app-menu-left menu-left">
<h1><?php echo LNG('app');?></h1>
<ul class='setting'>
<a data-type="all"><i class="font-icon icon-reorder"></i><?php echo LNG('app_group_all');?></a>
<?php foreach($config['settings']['appType'] as $item){?>
<a data-type="<?php echo $item['type'];?>">
<i class="font-icon <?php echo $item['class']?>"></i><?php echo LNG($item['name']);?></a>
<?php } ?>
</ul>
</div>
<div class='app-content main'>
<div class="app-model">
<?php if($GLOBALS['isRoot']){ ?><button class="btn btn-default create-app" action='createApp'><?php echo LNG('app_create');?></button><?php } ?>
<div class='h1'><i class="font-icon icon-user"></i><?php echo LNG('app_group_all');?></div>
<ul class="app-list"></ul>
</div>
</div>
</div>
<?php include(TEMPLATE.'common/footerCommon.html');?>
<script type="text/javascript">
seajs.use('app/src/app/main');
</script>
</body>
</html>
@@ -0,0 +1,26 @@
<div class="common-footer aero">
<?php
$settings = $GLOBALS['config']['settings'];
$settingSystem = $GLOBALS['config']['settingSystem'];
$copyrightInfo = LNG('copyright_info',APP_HOST);
if(is_wap()){
echo '<span class="pr-10"><a href="javascript:void(0);" forceWap="1">'.LNG('wap_page_phone').'</a> | '.
'<a href="javascript:void(0);" forceWap="0">'.LNG('wap_page_pc').'</a></span> ';
echo $copyrightInfo.' v'.KOD_VERSION;
}else{
echo '<span class="copyright-content">';
if(isset($settings['copyright'])){
echo $settings['copyright'];
}else{
echo LNG('copyright_pre').' v'.KOD_VERSION.' | '.$copyrightInfo;
}
echo '<a href="javascript:core.copyright();" class="icon-info-sign copyright-bottom pl-5"></a>';
if(isset($settingSystem['globalIcp'])){
echo "&nbsp;&nbsp; ".$settingSystem['globalIcp'];
}
echo '</span>';
}
?>
</div>
<!-- https://getfirebug.com/firebuglite -->
<?php include(TEMPLATE.'common/footerCommon.html');?>
@@ -0,0 +1,44 @@
<script type="text/javascript" src="<?php echo STATIC_PATH;?>js/lib/seajs/sea.js?ver=<?php echo KOD_VERSION;?>"></script>
<?php
//commonjs
if(ST == 'share' || isset($GLOBALS['loadCommonJs'])){
if(isset($_GET['user'])){
$userInfo = '&user='.clear_html($_GET['user']).'&sid='.clear_html($_GET['sid']);
}else{//login...
$userInfo = "";
}
echo '<script type="text/javascript" src="./index.php?share/commonJs&st='.ST.'&act='.ACT.$userInfo.'#id='.rand_string(4).'"></script>';
}else{
echo '<script type="text/javascript" src="./index.php?user/commonJs&st='.ST.'&act='.ACT.'#id='.rand_string(4).'"></script>';
}
$settings = $GLOBALS['config']['settings'];
$settingSystem = $GLOBALS['config']['settingSystem'];
if(isset($settings['globalJs'])){
echo "\n ".'<script type="text/javascript" id="settings-global-js">'.$settings['globalJs'].'</script>';
}
if(isset($settings['globalCss'])){
echo "\n ".'<style type="text/css" id="settings-global-css">'.$settings['globalCss'].'</style>';
}
if(isset($settingSystem['globalCss'])){
echo "\n ".'<style type="text/css" id="setting-system-global-css">'.$settingSystem['globalCss'].'</style>';
}
if(isset($settingSystem['globalHtml'])){
echo "\n ".$settingSystem['globalHtml']."\n";
}
?>
<script type="text/javascript">
<?php
if(defined('INSTALL_CHANNEL')){
echo "var installChannel='".INSTALL_CHANNEL."';\n";
}
?>
seajs.config({
base: "<?php echo STATIC_PATH;?>js/",
preload: ["lib/jquery-1.8.0.min"],
map:[[/^(.*\.(?:css|js|html|htm|json|text))([\?|#].*)$/i,'$1$2?ver='+G.version]]
});
if(navigator.serviceWorker){navigator.serviceWorker.register('./?share/manifestJS');}
</script>
<?php Hook::trigger('templateCommonFooter');?>
@@ -0,0 +1,39 @@
<?php Hook::trigger('templateCommonHeaderStart'); ?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta http-equiv="Content-Script-Type" content="text/javascript">
<meta http-equiv="Cache-Control" content="no-transform">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<meta name="renderer" content="webkit">
<meta name="description" itemprop="description" content="<?php echo LNG('kod_meta_description');?>">
<meta name="keywords" content="<?php echo LNG('kod_meta_keywords');?>" />
<meta name="generator" content="<?php echo LNG('kod_meta_name').' '.KOD_VERSION;?>"/>
<meta name="author" content="<?php echo LNG('kod_meta_name');?>" />
<meta name="copyright" content="<?php echo LNG('kod_meta_copyright');?>" />
<meta itemprop="image" content="<?php echo STATIC_PATH;?>images/common/ico.png?ver=<?php echo KOD_VERSION;?>" />
<link href="<?php echo STATIC_PATH;?>images/common/ico.png?ver=<?php echo KOD_VERSION;?>" rel="Shortcut Icon" type="image/x-icon">
<link href="<?php echo STATIC_PATH;?>images/common/ico.png?ver=<?php echo KOD_VERSION;?>" rel="icon" type="image/x-icon">
<link href="<?php echo STATIC_PATH;?>style/common.css?ver=<?php echo KOD_VERSION;?>" rel="stylesheet"/>
<link href="./static/style/font-awesome/css/font-awesome.css?ver=<?php echo KOD_VERSION;?>" rel="stylesheet">
<link href="./?share/manifest" rel="manifest" />
<!--[if IE 7]>
<link rel="stylesheet" href="./static/style/font-awesome/css/font-awesome-ie7.css">
<![endif]-->
<?php
Hook::trigger('templateCommonHeader');
function pageBackground(){
$arr = explode(',',$GLOBALS['config']['settingSystem']['wallpageLogin']);
$background = $arr[mt_rand(0,count($arr)-1)];
if(!$background){
$background = 'linear-gradient(160deg, #5648c1, #6fe3e7)';
}else if(!strstr($background,'/')){
$background = "url('./static/images/wall_page/{$background}.jpg')";
}else{
$background = "url('{$background}')";
}
return "<style type='text/css'>.aero:before,.aero:after,.background{background-color:#bbb;background-image:{$background};}</style>\n";
}
?>
@@ -0,0 +1,118 @@
<div class="full-background"></div>
<div class="init-loading">
<div><img src="<?php echo STATIC_PATH;?>images/common/loading_simple.gif?v=<?php echo KOD_VERSION;?>"/></div>
</div>
<div class="topbar aero">
<div class="content">
<button class="btn btn-wap-menu hidden"
data-toggle="collapse" data-target="#top-menu-left"
><i class="font-icon icon-reorder"></i></button>
<div class="top-left collapse" id="top-menu-left">
<?php
$config = $GLOBALS['config'];
$html = '<a href="./" class="topbar-menu title">';
$subMenu = '';
$isWap = is_wap();
if(substr(LNG('kod_name'),0,4) == '<img'){
$html .= LNG('kod_name').'</a>';
}else{
$html .= '<i class="icon-cloud"></i>'.LNG('kod_name').'</a>';
}
foreach ($config['settingSystem']['menu'] as $key=>$value) {
if ($value['use']!='1') continue;
$has = ST==$value['name']?'this':'';
$target = " target='_self'" ;
if($value['target']=='1' || $value['target'] == '_blank'){
$target = " target='_blank'" ;
}
$name = rawurldecode($value['name']);
if(LNG('ui_'.$name) != 'ui_'.$name){
$name = "<i class='font-icon menu-".$name."'></i><span>".LNG('ui_'.$name).'</span>';
}else if($value['icon']){
$name = $value['icon'].'<span>'.LNG($name).'</span>';
}else if(!strstr($name,'<') && $value['subMenu']){
$name = "<i class='font-icon words'><em>".$name."</em></i><span>".LNG($name).'</span>';
}
if($value['subMenu'] && !$isWap){
$subMenu .= "<li><a class='topbar-menu-sub ".$has."' href='".urldecode($value['url'])."'"
.$target.">".urldecode($name)."</a></li>";
}else{
$html .= "<a class='topbar-menu ".$has."' href='".urldecode($value['url'])."'"
.$target.">".urldecode($name)."</a>";
}
}
echo $html;
?>
<?php if($subMenu){?>
<div class="menu-group fl">
<a class="topbar-menu" id="topbar-submenu"
data-toggle="dropdown" href="#" title="<?php echo LNG('menu_sub_menu');?>">
<i class="icon-th-large"></i>
</a>
<ul class="dropdown-menu topbar-submenu pull-left animated menuShow" role="menu" aria-labelledby="topbar-submenu">
<?php echo $subMenu;?>
</ul>
</div>
<?php } ?>
</div>
<div class="top-right">
<?php if(!isset($config['settings']['language'])){ ?>
<div class="menu-group">
<a id='topbar-language' data-toggle="dropdown" href="#" class="topbar-menu">
<i class='font-icon icon-flag'></i>&nbsp;<b class="caret"></b>
</a>
<ul class="dropdown-menu topbar-language pull-right animated menuShow" role="menu" aria-labelledby="topbar-language">
<?php
$tpl = "";
foreach ($config['settingAll']['language'] as $key => $value) {
$name = $value[0];
$select = I18n::getType() == $key ? "this":"";
$tpl .= "<li><a href='javascript:core.language(\"{$key}\");' title=\"{$key}/{$value[1]}/{$value[2]}\" class='{$select}'><i class='lang-flag flag-{$key}'></i>{$name}</a></li>";
}
echo $tpl;
?>
</ul>
</div>
<?php } ?>
<!-- 全局设置语言则不再显示 -->
<div class="menu-group">
<a href="#" id='topbar-user' data-toggle="dropdown" class="topbar-menu">
<i class="font-icon icon-user"></i>
<?php
$user = $_SESSION['kodUser'];
$name = $user['nickName']?$user['nickName']:$user['name'];
echo clear_html($name);
?>&nbsp;
<b class="caret"></b>
</a>
<ul class="dropdown-menu menu-topbar-user pull-right animated menuShow" role="menu" aria-labelledby="topbar-user">
<?php if($GLOBALS['isRoot']){ ?>
<li class="menu-system-setting"><a href="#" onclick="core.setting('system');"><i class="font-icon icon-cog"></i><?php echo LNG('system_setting');?></a></li>
<?php } ?>
<?php if($GLOBALS['isRoot'] || $GLOBALS['auth']['systemMember.get']){ ?>
<li class="menu-system-group"><a href="#" onclick="core.setting('member');"><i class="font-icon icon-group"></i><?php echo LNG('setting_member');?></a></li>
<?php } ?>
<?php if($GLOBALS['isRoot'] || $GLOBALS['auth']['pluginApp.index']){ ?>
<li class="menu-system-plugin">
<a href="#" onclick="core.openWindowBig('./index.php?pluginApp/index','<?php echo LNG('PluginCenter');?>');"><i class="font-icon icon-puzzle-piece"></i><?php echo LNG('PluginCenter');?></a></li>
<li role="presentation" class="divider"></li>
<?php } ?>
<li class="menu-system-user"><a href="#" onclick="core.setting('user');"><i class="font-icon icon-user"></i><?php echo LNG('setting_user');?></a></li>
<li class="menu-system-theme"><a href="#" onclick="core.setting('theme');"><i class="font-icon icon-dashboard"></i><?php echo LNG('setting_theme');?></a></li>
<li class="menu-system-full"><a href="#" onclick="core.fullScreen();"><i class="font-icon icon-fullscreen"></i><?php echo LNG('full_screen');?></a></li>
<li class="menu-system-help"><a href="#" onclick="core.setting('help');"><i class="font-icon icon-question"></i><?php echo LNG('setting_help');?></a></li>
<li class="menu-system-about"><a href="#" onclick="core.setting('about');"><i class="font-icon icon-info-sign"></i><?php echo LNG('setting_about');?></a></li>
<li role="presentation" class="divider"></li>
<li class="menu-system-logout"><a href="./index.php?user/logout"><i class="font-icon icon-signout"></i><?php echo LNG('ui_logout');?></a></li>
</ul>
</div>
</div>
<div style="clear:both"></div>
</div>
</div>
@@ -0,0 +1,67 @@
<div class="full-background"></div>
<div class="init-loading"><div>
<img src="<?php echo STATIC_PATH;?>images/common/loading_simple.gif?v=<?php echo KOD_VERSION;?>"/></div>
</div>
<div class="topbar share-page-topbar">
<div class="content">
<div class="top-left">
<a href="./" class="topbar-menu title">
<?php
if(substr(LNG('kod_name'),0,4) == '<img'){
echo LNG('kod_name');
}else{
echo '<i class="icon-cloud"></i>'.LNG('kod_name');
}
?>
</a>
<div class="share-info">
<span class="share-title">
<b class="share-title-info">
<?php clear_html($shareInfo['showName']);?>
</b>
</span>
<span class="size"></span>
<span class="time"></span>
</div>
<div style="clear:both;"></div>
</div>
<div class="top-right">
<div class="share-info-user hidden menu-group" style="z-index:9999;">
<span class="info"></span>
<div class="btn-group">
<a type="button" class="btn btn-primary btn-download" target="_blank" href=""><?php echo LNG('download');?></a>
</div>
</div>
<?php if(!isset($config['settings']['language'])){ ?>
<div class="menu-group">
<a id='topbar-language' data-toggle="dropdown" href="#" class="topbar-menu">
<i class='font-icon icon-flag'></i>&nbsp;<b class="caret"></b>
</a>
<a href="#" onclick="core.qrcode(window.location.href);" title="<?php echo LNG('qrcode');?>" class="topbar-menu" style="padding: 0 15px;margin-left: -2px;">
<i class="font-icon icon-qrcode"></i>
</a>
<ul class="dropdown-menu topbar-language pull-right animated menuShow" role="menu" aria-labelledby="topbar-language">
<?php
$tpl = "";
foreach ($config['settingAll']['language'] as $key => $value) {
$name = $value[0];
$select = I18n::getType() == $key ? "this":"";
$tpl .= "<li><a href='javascript:core.language(\"{$key}\");' title=\"{$key}/{$value[1]}/{$value[2]}\" class='{$select}'><i class='lang-flag flag-{$key}'></i>{$name}</a></li>";
}
echo $tpl;
?>
</ul>
</div>
<?php } ?>
<div class="menu-group">
<a href="#" id='topbar-user' class="topbar-menu" data-toggle="dropdown"><i class="font-icon icon-user"></i><?php echo $_SESSION['kodUser']['name'];?>&nbsp;<b class="caret"></b></a>
<ul class="dropdown-menu menu-topbar-user pull-right animated menuShow" role="menu" aria-labelledby="topbar-user">
<li><a href="#" onclick="core.fullScreen();"><i class="font-icon icon-fullscreen"></i><?php echo LNG('full_screen');?></a></li>
<li class="version_vip_free"><a href="http://kodcloud.com" target="_blank"><i class="font-icon icon-code-fork"></i><?php echo LNG('ui_project_home');?></a></li>
</ul>
</div>
</div>
<div style="clear:both"></div>
</div>
</div>
@@ -0,0 +1,103 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<link href="<?php echo STATIC_PATH;?>style/common.css?ver=<?php echo KOD_VERSION;?>" rel="stylesheet"/>
<link href="./static/style/font-awesome/css/font-awesome.css?ver=<?php echo KOD_VERSION;?>" rel="stylesheet">
<title><?php echo $title;?></title>
<script type="text/javascript" src="<?php echo STATIC_PATH;?>js/lib/jquery-1.8.0.min.js?ver=<?php echo KOD_VERSION;?>"></script>
<style type="text/css">
body{
background-color:#f0f2f5;
font-family: Verdana,"Lantinghei SC","Hiragino Sans GB","Microsoft Yahei",Helvetica,arial,sans-serif;
line-height: 1.5em;
}
body a,body a:hover{color: #1890ff;}
.body-panel{
width:70%;margin:10% auto 5% auto;
font-size: 13px;
color:#666;
background:#fff;border-radius:4px;
padding-top:50px;padding-bottom:100px;
box-shadow: 0 5px 20px rgba(0,0,0,0.05);
}
.body-panel .check-result{text-align: center;color:#000;}
.body-panel .check-result .icon{width:70px;height:70px;line-height:70px;font-size:30px;}
.check-result-title{font-size: 24px;line-height: 32px;margin:20px 0;}
.check-result-desc{
color: #333;
margin: 0 0 20px 0;
background: #fafafa;
font-size: 16px;
width: 80%;
margin: 0 auto;
border-radius: 2px;
padding: 24px 40px;
text-align: left;
}
.error-info{
border-left: 5px solid #1890ff;
display: block;
padding: 5px 10px;
background: #fcfcfc;
color: #666;
word-break: break-all;
font-family: monospace;
}
.location-to{padding: 10px 0;color: #888;font-size: 13px;font-style: italic;}
.icon{
font-family: FontAwesome;
display: inline-block;
width: 20px;
height: 20px;
background: rgba(0, 0, 0, 0.02);
text-align: center;
color: #666;
border-radius: 50%;
line-height: 20px;
font-size: 12px;
}
.icon.icon-loading{
-webkit-animation: moveCircleLoopRight 1.4s infinite linear;
animation: moveCircleLoopRight 1.4s infinite linear;
}
.icon.icon-loading:before{content:"\f110";}
.icon.icon-success{background:#52c41a;color:#fff;}
.icon.icon-success:before{content:"\f00c";}
.icon.icon-error{background:#f5222d;color:#fff;}
.icon.icon-error:before{content:"\f00d";}
</style>
</head>
<body>
<div class="body-panel">
<div class="check-result">
<!-- <div class="icon icon-error"></div> -->
<div class="check-result-title"><?php echo $title;?></div>
<div class="check-result-desc">
<span class="error-info"><?php echo $message;?></span>
<div class="location-to"><?php echo $info;?></div>
</div>
</div>
</div>
<?php if($url){ ?>
<script>
var timeout = parseInt("<?php echo $time;?>");
var link = "<?php echo $url;?>";
var loop = setInterval(function(){
timeout --;
var info = timeout + "s 后自动跳转, <a href='"+link+"'>立即跳转</a>";
$('.location-to').html(info);
if(timeout<=0){
clearInterval(loop);
window.location.href = link;
}
},1000);
</script>
<?php } ?>
</body>
</html>
@@ -0,0 +1,55 @@
<?php include(TEMPLATE.'common/header.html');?>
<title><?php echo LNG('ui_desktop').' - '.strip_tags(LNG('kod_name')).LNG('kod_power_by');?></title>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/base/app_desktop.css?ver=<?php echo KOD_VERSION;?>"/>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/<?php echo $config['user']['theme'];?>.css?ver=<?php echo KOD_VERSION;?>" id='link-theme-style'/>
</head>
<body style="overflow: hidden;" oncontextmenu="return core.contextmenu();" id="page-desktop">
<?php echo '<style >.aero:before,.aero:after,.full-background-wall{background-image:url('.$wall.')}</style>';?>
<div class="full-background-wall desktop"><img class="background" /></div>
<?php include(TEMPLATE.'common/navbar.html');?>
<div class='bodymain drag-upload-box desktop'>
<div class="file-continer file-list-icon hidden"></div>
</div><!-- html5拖拽上传list -->
<a href="#" class="start"></a>
<div id="taskbar" style="display:block;" class="">
<div class="taskbar-background aero"></div>
<div id="desktop"></div>
</div>
<div class="taskbar-right">
<div class="copyright dropdown-toggle"><i class="icon-info-sign"></i></div>
<div class="tab-hide-all"></div>
</div>
<div id="menuwin" class="aero">
<div id="startmenu"></div>
<ul id="programs">
<li class='setting_help'><a href="#" onclick="core.setting('help');"><?php echo LNG('setting_help');?></a></li>
<li><div id="leftspliter"></div></li>
<li class='setting_about'><a href="#" onclick="core.setting('about');"><?php echo LNG('setting_about');?></a></li>
<li class='setting_user'><a href="#" onclick="core.setting('user');"><?php echo LNG('setting_user');?></a></li>
<li class='setting_homepage'><a href="#" onclick="core.openWindow('http://kodcloud.com','<?php echo $L['my_document'];?>');">kodCloud 主页</a></li>
</ul>
<ul id="links">
<li class="icon"></li>
<li><a href="#" onclick="core.explorer('<?php echo KOD_USER_SHARE.':'.$_SESSION['kodUser']['userID'].'/';?>','<?php echo LNG('my_share');?>');"><span><?php echo LNG('my_share');?></span></a></li>
<li><a href="#" onclick="core.explorer('<?php echo MYHOME;?>/pictures','<?php echo LNG('my_picture');?>');"><span><?php echo LNG('my_picture');?></span></a></li>
<li><a href="#" onclick="core.explorer('<?php echo MYHOME;?>/music','<?php echo LNG('my_music');?>');"><span><?php echo LNG('my_music');?></span></a></li>
<li><a href="#" onclick="core.explorer('<?php echo MYHOME;?>/download','<?php echo LNG('download');?>');"><span><?php echo LNG('download');?></span></a></li>
<li><div id="rightspliter"></div></li>
<li><a href="#" onclick="core.setting('wall');"><span><?php echo LNG('setting_wall');?></span></a></li>
<li><a href="#" onclick="core.setting('fav');"><span><?php echo LNG('setting_fav');?></span></a></li>
<li><a href="#" onclick="core.setting('theme');"><span><?php echo LNG('setting_theme');?></span></a></li>
<li><a href="./index.php?user/logout" style="margin-top:70px;"><span><?php echo LNG('ui_logout');?>></span></a></li>
</ul>
</div>
<?php include(TEMPLATE.'common/footerCommon.html');?>
<script type="text/javascript">
var desktopApps = <?php echo json_encode($desktopApps);?>;
G.thisPath = G.myDesktop;
seajs.use("app/src/desktop/main");
</script>
</body>
</html>
+90
View File
@@ -0,0 +1,90 @@
<?php include(TEMPLATE.'common/header.html');?>
<title><?php echo strip_tags(LNG('kod_name')).LNG('kod_power_by');?></title>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/base/app_code_edit.css?ver=<?php echo KOD_VERSION;?>"/>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/<?php echo $config['user']['theme'];?>.css?ver=<?php echo KOD_VERSION;?>" id='link-theme-style'/>
</head>
<body <?php echo $codeThemeBlack;?>>
<div class="init-loading">
<div><img src="<?php echo STATIC_PATH;?>images/common/loading_simple.gif?v=<?php echo KOD_VERSION;?>"/></div>
</div>
<div class="edit-main" style="height: 100%;" oncontextmenu="return core.contextmenu();">
<div class="tools">
<div class="left top-toolbar">
<div class="disable-mask"></div>
<a action="save" href="javascript:;" title="<?php echo LNG('button_save');?>(Ctrl-S)"><i class="font-icon icon-save"></i></a>
<a action="saveall" href="javascript:;" title="<?php echo LNG('button_save_all');?>"><i class="font-icon icon-paste"></i></a>
<span class="line"></span>
<a href="javascript:;" id="editor-history-back" title="<?php echo LNG('history_back');?>(Ctrl -)"><i class="font-icon icon-chevron-left"></i></a>
<a href="javascript:;" id="editor-history-next" title="<?php echo LNG('history_next');?>(Ctrl Shift -)"><i class="font-icon icon-chevron-right"></i></a>
<span class="line"></span>
<a action="undo" href="javascript:;" title="<?php echo LNG('undo');?>(Ctrl-Z)"><i class="font-icon icon-undo"></i></a>
<a action="redo" href="javascript:;" title="<?php echo LNG('redo');?>(Ctrl-Y)"><i class="font-icon icon-repeat"></i></a>
<a action="refresh" href="javascript:;" title="<?php echo LNG('refresh');?>(F5)"><i class="font-icon icon-refresh"></i></a>
<span class="line"></span>
<a href="javascript:;" class="toolbar-menu menu-view-goto-line" title="<?php echo LNG('gotoline');?>(Ctrl-L)"><i class="font-icon icon-pushpin"></i></a>
<a action="search" href="javascript:;" title="<?php echo LNG('search');?>(Ctrl-F)"><i class="font-icon icon-search"></i></a>
<a action="searchReplace" href="javascript:;" title="<?php echo LNG('replace');?>(Ctrl-F-F)"><i class="font-icon icon-random"></i></a>
<span class="line"></span>
<a action="font" class="toolbar-menu menu-view-font" href="javascript:;" title="<?php echo LNG('font_size');?>">
<i class="font-icon icon-font"></i><i class="font-icon icon-caret-down"></i>
</a>
<span class="line"></span>
<a class="toolbar-menu menu-view-theme" href="javascript:;" title="<?php echo LNG('code_theme');?>">
<i class="font-icon icon-magic"></i><i class="font-icon icon-caret-down"></i>
</a>
<a class="toolbar-menu menu-view-setting" href="javascript:;">
<i class="font-icon icon-cog"></i><i class="font-icon icon-caret-down"></i>
</a>
<a action="preview" href="javascript:;" title="<?php echo LNG('preview');?>(Ctrl-Shift-S)"><i class="font-icon icon-eye-open"></i></a>
</div>
<div class="right">
<button class="btn btn-xs btn-default btn-right" action="close" title="<?php echo LNG('close');?>"><i class="font-icon icon-remove"></i></button>
<button class="btn btn-xs btn-default btn-left" action="fullscreen" title="<?php echo LNG('full_screen');?>"><i class="font-icon icon-resize-full"></i></button>
</div>
<div style="clear:both"></div>
</div><!-- end tools -->
<!-- 主体部分 -->
<div class="frame-left">
<div class="edit-tab">
<div class="tabs">
<a href="javascript:Editor.add()" class="add icon-plus"></a>
<div style="clear:both"></div>
</div>
</div>
<div class="edit-body">
<div class="introduction hidden">
<button class="btn btn-default font-icon icon-remove close-item"></button>
<?php include(LANGUAGE_PATH.I18n::getType().'/edit.html');?>
<div style="clear:both"></div>
</div>
<div class="tabs"></div>
<div class="bottom-toolbar hidden">
<a class="toolbar-menu menu-view-goto-line editor_position" href="javascript:;">0:0</a>
<a class="file-mode" href="javascript:;">text</a>
<a class="toolbar-menu menu-view-file-charset " href="javascript:;">UTF-8</a>
<a class="toolbar-menu menuViewTab config-tab" href="javascript:;">Tabs:4</a>
<a class="toolbar-menu menu-view-setting config" href="javascript:;"><i class="font-icon icon-cog"></i></a>
<div style="clear:both"></div>
</div>
</div>
<div class="search-content hidden"></div>
</div>
</div>
<?php include(TEMPLATE.'common/footerCommon.html');?>
<script type="text/javascript">
G.codeConfig = <?php echo $editorConfig;?>;
G.codeThemeAll = "<?php echo $config['settingAll']['codethemeall']?>";
G.codeFontAll = "<?php echo $config['settingAll']['codefontall']?>";
seajs.config({
preload: [
"lib/jquery-1.8.0.min",
'lib/ace/src-min-noconflict/ace'
]
});
seajs.use("app/src/edit/main");
</script>
</body>
</html>
@@ -0,0 +1,45 @@
<?php include(TEMPLATE.'common/header.html');?>
<title><?php echo LNG('ui_editor').' - '.strip_tags(LNG('kod_name')).LNG('kod_power_by');?></title>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/base/app_editor.css?ver=<?php echo KOD_VERSION;?>"/>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/<?php echo $config['user']['theme'];?>.css?ver=<?php echo KOD_VERSION;?>" id='link-theme-style'/>
</head>
<?php if(isset($_GET['project'])){?>
<style>.topbar{display: none;}.frame-header{top:0;}.frame-main{top:0px;}</style>
<?php } ?>
<body style="overflow:hidden;" oncontextmenu="return core.contextmenu();" id="page-editor">
<?php include(TEMPLATE.'common/navbar.html');?>
<div class="frame-main">
<div class="tools-left">
<a class="home" href="#" title='<?php echo LNG('root_path');?>'><i class="icon-home"></i></a>
<a class="view" href="#" title='<?php echo LNG('manage_folder');?>'><i class="icon-laptop"></i></a>
<a class="folder" href="#" title='<?php echo LNG('newfolder');?>'><i class="icon-folder-close-alt"></i></a>
<a class="file" href="#" title='<?php echo LNG('newfile');?>'><i class="icon-file-alt"></i></a>
<a class="refresh" href="#" title='<?php echo LNG('refresh');?>'><i class="icon-refresh"></i></a>
</div>
<div class='frame-left'>
<ul id="folder-list-tree" class="ztree"></ul>
</div><!-- / frame-left end-->
<div class='frame-resize'></div>
<div class='frame-right'>
<div class="frame-right-main" style="height:100%;padding:0;margin:0;">
<div class="resize-mask"></div>
<div class="message-box"><div class="content"></div></div>
<div class="menu-tree-root"></div>
<div class="menu-tree-folder"></div>
<div class="menu-tree-file"></div>
<div class ='frame'>
<iframe name="OpenopenEditor" src="./index.php?editor/edit" style="width:100%;height:100%;border:0;" frameborder=0></iframe>
</div>
</div>
</div><!-- / frame-right end-->
</div><!-- / frame-main end-->
<?php include(TEMPLATE.'common/footerCommon.html');?>
<script type="text/javascript">
G.project = "<?php echo clear_html($_GET['project']) ;?>";
seajs.use("app/src/editor/main");
</script>
</body>
</html>
@@ -0,0 +1,234 @@
<div class="frame-main">
<div class='frame-left'>
<ul id="folder-list-tree" class="ztree"></ul>
<div class="bottom-box">
<div class="user-space-info"></div>
<div class="box-content">
<div class="cell menu-recycle-button"><i class="font-icon icon-trash"></i><span><?php echo LNG('recycle');?></span></div>
<div class="cell menuShareButton"><i class="font-icon icon-share-sign"></i><span><?php echo LNG('my_share');?></span></div>
<div style="clear:both"></div>
</div>
</div>
</div><!-- / frame-left end-->
<div class='frame-resize'></div>
<div class='frame-right'>
<div class="frame-header">
<div class="header-content">
<div class="header-left">
<div class="btn-group btn-group-sm">
<button class="btn btn-default" id='btn-history-back' title='<?php echo LNG('history_back');?>' type="button">
<i class="font-icon icon-angle-left"></i>
</button>
<button class="btn btn-default" id='btn-history-next' title='<?php echo LNG('history_next');?>' type="button">
<i class="font-icon icon-angle-right"></i>
</button>
</div>
</div><!-- /header left -->
<div class='header-middle'>
<button class="btn btn-default btn-left-radius ml-10" id='home' title='<?php echo LNG('root_path');?>'>
<i class="font-icon icon-home"></i>
</button>
<div id='yarnball' title="<?php echo LNG('address_in_edit');?>"></div>
<div id='yarnball-input'><input type="text" name="path" value="" class="path" id="path"/></div>
<button class="btn btn-default" id='fav' title='<?php echo LNG('add_to_fav');?>' type="button">
<i class="font-icon icon-star"></i>
</button>
<!-- <button class="btn btn-default" id='refresh' title='<?php echo LNG('refresh_all');?>' type="button">
<i class="font-icon icon-refresh"></i>
</button> -->
<button class="btn btn-default btn-right-radius" id='goto-father' title='<?php echo LNG('go_up');?>' type="button">
<i class="font-icon icon-circle-arrow-up"></i>
</button>
<div class="path-tips" title="<?php echo LNG('only_read_desc');?>" title-timeout="0">
<i class="icon-warning-sign"></i><span></span>
</div>
<div class="role-label-box"></div>
</div><!-- /header-middle end-->
<div class='header-right'>
<input type="text" name="seach" class="btn-left-radius"/>
<button class="btn btn-default btn-right-radius" id='search' title='<?php echo LNG('search');?>' type="button">
<i class="font-icon icon-search"></i>
</button>
</div>
</div>
</div><!-- / header end -->
<div class="frame-right-main">
<div class="tools">
<div class="tools-left tools-left-share <?php if(ST!='share'){echo 'hidden';}?>">
<!-- 文件功能 -->
<div class="kod-toolbar kod-toolbar-path btn-group btn-group-sm">
<button data-action='select-all' class="btn btn-default" type="button">
<i class="font-icon icon-check"></i><?php echo LNG('selectAll');?>
</button>
<button data-action='upload' class="btn btn-default" type="button">
<i class="font-icon icon-cloud-upload"></i><?php echo LNG('upload');?>
</button>
<button data-action='download' class="btn btn-default" type="button">
<i class="font-icon icon-download"></i><?php echo LNG('download');?>
</button>
</div>
<span class='msg'><?php echo LNG('path_loading');?></span>
<div class="clear"></div>
</div>
<div class="tools-left tools-left-explorer <?php if(ST=='share'){echo 'hidden';}?>">
<!-- 回收站tool -->
<div class="kod-toolbar kod-toolbar-recycle btn-group btn-group-sm hidden fl-left">
<button data-action='recycle-clear' class="btn btn-default" type="button">
<i class="font-icon icon-folder-close-alt"></i><?php echo LNG('recycle_clear');?>
</button>
</div>
<!-- 分享 tool -->
<div class="kod-toolbar kod-toolbar-share hidden fl-left">
<button data-action='refresh' class="btn btn-sm btn-default fl-left" type="button">
<i class="font-icon icon-refresh"></i><?php echo LNG('refresh');?>
</button>
<div class="select-button-show-share btn-group btn-group-sm fl-left ml-10 mr-10 hidden">
<button data-action='remove' class="btn btn-default" type="button">
<i class="font-icon icon-remove"></i><?php echo LNG('share_remove');?>
</button>
<button data-action='shareEdit' class="btn btn-default" type="button">
<i class="font-icon icon-edit"></i><?php echo LNG('share_edit');?>
</button>
<button data-action='shareOpenWindow' class="btn btn-default" type="button">
<i class="font-icon icon-link"></i><?php echo LNG('share_open_page');?>
</button>
</div>
</div>
<!-- 文件功能 -->
<div class="kod-toolbar kod-toolbar-path fl-left">
<div class="select-button-default btn-group btn-group-sm fl-left mr-10">
<button data-action='newfolder' class="btn btn-default" type="button">
<i class="font-icon icon-folder-close-alt"></i><?php echo LNG('newfolder');?>
</button>
<button data-action='newfile' class="btn btn-default tool-path-newfile" type="button">
<i class="font-icon icon-caret-down"></i>
</button>
</div>
<div class="select-button-default btn-group btn-group-sm fl-left mr-10">
<button data-action='upload' class="btn btn-default" type="button">
<i class="font-icon icon-cloud-upload"></i><?php echo LNG('upload');?>
</button>
<button data-action='upload-more' class="btn btn-default tool-path-upload" type="button">
<i class="font-icon icon-caret-down"></i>
</button>
</div>
<div class="select-button-show btn-group btn-group-sm fl-left ml-10 mr-10 hidden">
<button data-action='share' class="btn btn-default" type="button">
<i class="font-icon icon-share"></i><?php echo LNG('share');?>
</button>
<button data-action='download' class="btn btn-default" type="button">
<i class="font-icon icon-download"></i><?php echo LNG('download');?>
</button>
<button data-action='remove' class="btn btn-default" type="button">
<i class="font-icon icon-remove"></i><?php echo LNG('remove');?>
</button>
<button data-action='rname' class="btn btn-default" type="button">
<i class="font-icon icon-rename"></i><?php echo LNG('rename');?>
</button>
<button data-action='copy' class="btn btn-default" type="button">
<i class="font-icon icon-copy"></i><?php echo LNG('copy');?>
</button>
<button data-action='cute' class="btn btn-default" type="button">
<i class="font-icon icon-cute"></i><?php echo LNG('cute');?>
</button>
<button type="button" class="btn btn-default btn-sm toolbar-path-more fl-left mr-10">
<i class="font-icon icon-ellipsis-horizontal"></i>
<?php echo LNG('button_more');?>&nbsp;<span class="caret"></span>
</button>
</div>
<div class="group-space-use fl-left hidden"></div>
<div class="admin-real-path hidden fl-left">
<button type="button" class="btn btn-default btn-sm dialog-goto-path ml-10" title="<?php echo LNG('open_the_path');?>">
<i class="font-icon icon-folder-open"></i>
</button>
</div>
<span class='msg fl-left'><?php echo LNG('path_loading');?></span>
<div class="clear"></div>
</div>
</div>
<div class="tools-right">
<div class="btn-group btn-group-sm">
<button data-action='set-icon' title="<?php echo LNG('list_icon');?>" type="button" class="btn btn-default">
<i class="font-icon icon-th"></i>
</button>
<button data-action='set-list' title="<?php echo LNG('list_list');?>" type="button" class="btn btn-default">
<i class="font-icon icon-list"></i>
</button>
<button data-action='set-split' title="<?php echo LNG('list_list_split');?>" type="button" class="btn btn-default">
<i class="font-icon icon-columns"></i>
</button>
<div class="btn-group btn-group-sm menu-theme-list">
<button data-action="set-theme" title="<?php echo LNG('setting_theme');?>" type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown">
<i class="font-icon icon-dashboard"></i>&nbsp;&nbsp;<span class="caret"></span>
</button>
<ul class="dropdown-menu pull-right dropdown-menu-theme animated menuShow">
<?php
$arr = explode(',',$config['settingAll']['themeall']);
foreach ($arr as $value) {
echo "<li class='list' theme='{$value}'><a href='javascript:void(0);'>".LNG('theme_'.$value)."</a></li>\n";
}
?>
</ul>
</div>
</div>
<div class="set-icon-size">
<span class="dropdown-toggle" data-toggle="dropdown">
<i class="font-icon icon-zoom-in"></i>
</span>
<ul class="dropdown-menu set-icon-size-slider animated menuShow">
<div class="slider-bg"></div>
<div class="slider-handle"></div>
</ul>
</div>
</div>
<div style="clear:both"></div>
</div><!-- end tools -->
<div id='list-type-header' class="hidden">
<div id="main-title">
<div class="filename" field="name"><?php echo LNG('name');?><span></span></div><div class="resize filename-resize"></div>
<div class="filetype" field="ext"><?php echo LNG('type');?><span></span></div><div class="resize filetype-resize"></div>
<div class="filesize" field="size"><?php echo LNG('size');?><span></span></div><div class="resize filesize-resize"></div>
<div class="filetime" field="mtime"><?php echo LNG('modify_time');?><span></span></div><div class="resize filetime-resize"></div>
<div style="clear:both"></div>
</div>
</div>
</div><!-- list type 列表排序方式 -->
<div class='bodymain drag-upload-box menu-body-main'>
<div class="line-split-box hidden">
<div class="split-line"></div>
<div class="split-line"></div>
<div class="split-line"></div>
<div class="split-line"></div>
<div class="split-line"></div>
<div class="split-line"></div>
<div class="split-line"></div>
<div class="split-line"></div>
<div class="split-line"></div>
<div class="split-line"></div>
</div>
<div class="file-continer"></div>
<div class="file-continer-more"></div>
</div><!-- html5拖拽上传list -->
<div class="file-select-info">
<span class="item-num"></span>
<span class="item-select"></span>
</div>
</div>
</div><!-- / frame-right end-->
</div><!-- / frame-main end-->
@@ -0,0 +1,147 @@
<?php include(TEMPLATE.'common/header.html');?>
<title><?php echo LNG('ui_explorer').' - '.strip_tags(LNG('kod_name')).LNG('kod_power_by');?></title>
<link href="<?php echo STATIC_PATH;?>style/wap/app_explorer.css?ver=<?php echo KOD_VERSION;?>" rel="stylesheet"/>
</head>
<body>
<div class="init-loading"><div><img src="<?php echo STATIC_PATH;?>images/common/loading_simple.gif?v=<?php echo KOD_VERSION;?>"/></div></div>
<div class="panel-menu">
<div class="panel-hd">
<span class="my-avator">
<?php
$avatar = STATIC_PATH.'images/common/pic.jpg';
$name = $_SESSION['kodUser']['name'];
if($_SESSION['kodUser']['avatar']){
$avatar = $_SESSION['kodUser']['avatar'];
}
if($_SESSION['kodUser']['nickName']){
$name = $_SESSION['kodUser']['nickName'];
}
echo '<img src="'.$avatar.'"/>';
?>
</span>
<div><h3 class="name"><?php echo clear_html($name);?></h3></div>
</div>
<ul class="left-menu-path"></ul>
</div>
<div class="frame-main">
<div class="panel-mask"></div>
<div class="frame-header">
<div class="tool tool-menu-left">
<div class="menu"><i class="font-icon icon-reorder"></i></div>
</div>
<?php
$config = $GLOBALS['config'];
$subMenu = '';
foreach ($config['settingSystem']['menu'] as $key=>$value) {
if ($value['use']!='1') continue;
$has = ST==$value['name']?'this':'';
$target = " target='_self'" ;
if($value['target']=='1' || $value['target'] == '_blank'){
$target = " target='_blank'" ;
}
$name = $value['name'];
if(LNG('ui_'.$name) != 'ui_'.$name){
$name = "<i class='font-icon menu-".$value['name']."'></i><span>".LNG('ui_'.$name).'</span>';
}
if($value['icon']){
$name = $value['icon'].'<span>'.LNG($value['name']).'</span>';
}
$subMenu .= "<li><a class='topbar-menu-sub ".$has."' href='".urldecode($value['url'])."'"
.$target.">".urldecode($name)."</a></li>";
}
?>
<?php if($subMenu){?>
<div class="menu-group fl tool tool-submenu">
<button class="topbar-menu" id="topbar-submenu" data-toggle="dropdown">
<i class="icon-home"></i>
</button>
<ul class="dropdown-menu topbar-submenu pull-left animated menuShow" role="menu" aria-labelledby="topbar-submenu">
<?php echo $subMenu;?>
</ul>
</div>
<?php } ?>
<div class="title"><?php echo LNG('kod_name');?></div>
<div class="menu-group">
<div class="btn-list-icon"><i class="font-icon icon-home"></i></div>
</div>
</div>
<div class="address">
<ul class="yarnball"></ul>
<div style="clear: both"></div>
</div>
<div class='bodymain'>
<div class="file-continer file-list-list"></div>
</div>
<div class="file-menu">
<div class="file-action-menu hidden">
<div class="action-menu" data-action="action-copy">
<span class="content">
<i class="font-icon icon-copy"></i><?php echo LNG('copy');?>
</span>
</div>
<div class="action-menu" data-action="action-cute">
<span class="content">
<i class="font-icon icon-cut"></i><?php echo LNG('cute');?>
</span>
</div>
<div class='action-menu' data-action="action-share">
<span class="content">
<i class="font-icon icon-share"></i><?php echo LNG('share');?>
</span>
</div>
<div class='action-menu' data-action="action-rname">
<span class="content">
<i class="font-icon icon-pencil"></i><?php echo LNG('rename');?>
</span>
</div>
<div class='action-menu' data-action="action-download">
<span class="content">
<i class="font-icon icon-cloud-download"></i><?php echo LNG('download');?>
</span>
</div>
<div class='action-menu' data-action="action-info">
<span class="content">
<i class="font-icon icon-info"></i><?php echo LNG('info');?>
</span>
</div>
<div class="action-menu" data-action="action-remove">
<span class="content">
<i class="font-icon icon-trash"></i><?php echo LNG('remove');?>
</span>
</div>
<div class="menu-close">
<span class="content">
<i class="font-icon icon-ellipsis-horizontal"></i>
</span>
</div>
<div style="clear:both"></div>
</div>
</div>
<?php include(TEMPLATE.'common/footer.html');?>
</div><!-- / frame-main end-->
<div class="toolbar-menu">
<button class="menu-plus tool tool-menu-right-btn" data-toggle="dropdown"></button>
<ul class="dropdown-menu tool-menu-right pull-right animated menuShow" role="menu" >
<li data-action="upload"><a href="javascript:void();">
<i class="font-icon icon-cloud-upload"></i><?php echo LNG('upload');?></a></li>
<li data-action="newfolder"><a href="javascript:void();">
<i class="font-icon icon-folder-close-alt"></i><?php echo LNG('newfolder');?></a></li>
<li data-action="newfile"><a href="javascript:void();">
<i class="font-icon icon-file-text"></i><?php echo LNG('newfile');?></a></li>
<li data-action="past"><a href="javascript:void();">
<i class="font-icon icon-paste"></i><?php echo LNG('past');?></a></li>
<li data-action="search"><a href="javascript:void();">
<i class="font-icon icon-search"></i><?php echo LNG('search');?></a></li>
</ul>
</div>
<script type="text/javascript" >
G.thisPath = "<?php echo clear_html($dir);?>";
seajs.use("<?php echo STATIC_JS;?>/src/explorerWap/main");
</script>
</body>
</html>
@@ -0,0 +1,47 @@
<?php include(TEMPLATE.'common/header.html');?>
<title><?php echo LNG('ui_explorer').' - '.strip_tags(LNG('kod_name')).LNG('kod_power_by');?></title>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/base/app_explorer.css?ver=<?php echo KOD_VERSION;?>"/>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/<?php echo $config['user']['theme'];?>.css?ver=<?php echo KOD_VERSION;?>" id='link-theme-style'/>
</head>
<style>
<?php if(isset($_GET['type'])){?>
.topbar,.common-footer,.bottom-box{display:none;}
.frame-header{top:0;}
.frame-main{top:0px;bottom:0px;}
.frame-main .frame-left #folder-list-tree{bottom:0px !important;}
<?php if($_GET['type']=="explorer"){?>
.frame-header .header-content .header-left{display:none;}
.frame-header .header-content .header-middle{left:12px;}
.frame-main .frame-left,.frame-main .frame-resize{display:none;}
.frame-main .frame-right{left:0px;}
.task-tab{display:none;}
<?php } ?>
<?php if($_GET['type']=="fileList"){?>
.frame-header{display:none;}
.frame-main .frame-left,.frame-main .frame-resize{display:none;}
.frame-main .frame-right{left:0px;}
.frame-main{top:0px;}
.task-tab,#set_theme,#fav,#home{display:none !important;}
.header-middle{top:3px;left:5px;right:140px;}
#list-type-header{top:35px;}
<?php } ?>
<?php } ?>
</style>
<body style="overflow:hidden;" oncontextmenu="return core.contextmenu();" id="page-explorer">
<?php include(TEMPLATE.'common/navbar.html');?>
<?php include(TEMPLATE.'explorer/content.html');?>
<?php include(TEMPLATE.'common/footer.html');?>
<script type="text/javascript">
G.thisPath = "<?php echo clear_html($dir);?>";
seajs.use("app/src/explorer/main");
</script>
</body>
</html>
@@ -0,0 +1,45 @@
<?php include(TEMPLATE.'common/header.html');?>
<title><?php echo LNG('PluginCenter').' - '.strip_tags(LNG('kod_name')).LNG('kod_power_by');?></title>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/base/app_setting.css?ver=<?php echo KOD_VERSION;?>"/>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/<?php echo $config['user']['theme'];?>.css?ver=<?php echo KOD_VERSION;?>" id='link-theme-style'/>
</head>
<body oncontextmenu="return core.contextmenu();">
<div id="body" class="plugin-page">
<div class="app-menu-left menu-left">
<div class="search">
<div class="search-btn btn-search font-icon icon-search"></div>
<div class="search-btn btn-close font-icon icon-remove hidden"></div>
<input type="text" placeholder="<?php echo LNG('search');?>" />
</div>
<ul class='setting'>
<a data-type="install"><i class="font-icon icon-download-alt"></i><?php echo LNG('PluginInstalled');?></a>
<a data-type="update"><i class="font-icon icon-refresh"></i><?php echo LNG('PluginUpdate');?></a>
</ul>
<div class="line"><?php echo LNG("PluginType");?></div>
<ul class='setting'>
<a data-type="all"><i class="font-icon icon-reorder"></i><?php echo LNG("PluginTypeAll");?></a>
<a data-type="file"><i class="font-icon icon-folder-open-alt"></i><?php echo LNG("PluginTypeFile");?></la>
<a data-type="safe"><i class="font-icon icon-book"></i><?php echo LNG("PluginTypeSafe");?></a>
<a data-type="tools"><i class="font-icon icon-suitcase"></i><?php echo LNG("PluginTypeTools");?></a>
<a data-type="media"><i class="font-icon icon-film"></i><?php echo LNG("PluginTypeMedia");?></a>
<a data-type="others"><i class="font-icon icon-ellipsis-horizontal"></i><?php echo LNG("PluginTypeOthers");?></a>
</ul>
</div>
<div class='app-content main app-plugins'>
<div class="app-model app-content-box">
<div class='h1'></div>
<ul class="app-list"></ul>
</div>
<div class="app-model app-descript can-select can-right-menu hidden"></div>
</div>
</div>
<?php include(TEMPLATE.'common/footerCommon.html');?>
<script type="text/javascript">
seajs.use('app/src/plugins/main');
</script>
</body>
</html>
@@ -0,0 +1,32 @@
<?php include(TEMPLATE.'common/header.html');?>
<title><?php echo strip_tags(LNG('kod_name')).LNG('kod_power_by');?></title>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/base/app_setting.css?ver=<?php echo KOD_VERSION;?>"/>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/<?php echo $config['user']['theme'];?>.css?ver=<?php echo KOD_VERSION;?>" id='link-theme-style'/>
</head>
<body class="setting-page" oncontextmenu="return core.contextmenu();">
<div class="init-loading">
<div><img src="<?php echo STATIC_PATH;?>images/common/loading_simple.gif?v=<?php echo KOD_VERSION;?>"/></div>
</div>
<div id="body">
<div class="menu-left">
<h1><?php echo LNG('setting_title');?></h1>
<ul class='setting'>
<a href="javascript:void(0);" id="system"><i class="font-icon icon-cog"></i><?php echo LNG('system_setting');?></a>
<a href="javascript:void(0);" id="member"><i class="font-icon icon-group"></i><?php echo LNG('system_group');?></a>
<a href="javascript:void(0);" id="user"><i class="font-icon icon-user"></i><?php echo LNG('setting_user');?></li>
<a href="javascript:void(0);" id="theme"><i class="font-icon icon-dashboard"></i><?php echo LNG('setting_theme');?></a>
<a href="javascript:void(0);" id="wall"><i class="font-icon icon-picture"></i><?php echo LNG('setting_wall');?></a>
<a href="javascript:void(0);" id="fav"><i class="font-icon icon-star"></i><?php echo LNG('setting_fav');?></a>
<a href="javascript:void(0);" id="help"><i class="font-icon icon-question"></i><?php echo LNG('setting_help');?></a>
<a href="javascript:void(0);" id="about"><i class="font-icon icon-info-sign"></i><?php echo LNG('setting_about');?></a>
</ul>
</div>
<div class='main'></div>
</div>
<?php include(TEMPLATE.'common/footerCommon.html');?>
<script type="text/javascript">
seajs.use('app/src/setting/main');
</script>
</body>
</html>
+87
View File
@@ -0,0 +1,87 @@
<?php include(TEMPLATE.'common/header.html');?>
<title><?php echo clear_html($shareInfo['name']).' - '.LNG('share_title').' - '.strip_tags(LNG('kod_name')).LNG('kod_power_by');?></title>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/base/app_code_edit.css?ver=<?php echo KOD_VERSION;?>"/>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/<?php echo $configTheme;?>.css?ver=<?php echo KOD_VERSION;?>" id='link-theme-style'/>
</head>
<body <?php echo $codeThemeBlack;?>>
<div class="edit-main" style="height: 100%;" oncontextmenu="return core.contextmenu();">
<div class="tools">
<div class="left top-toolbar">
<div class="disable-mask"></div>
<a action="save" href="javascript:;" title="<?php echo LNG('button_save');?>(Ctrl-S)"><i class="font-icon icon-save"></i></a>
<a action="saveall" href="javascript:;" title="<?php echo LNG('button_save_all');?>"><i class="font-icon icon-paste"></i></a>
<span class="line"></span>
<a action="undo" href="javascript:;" title="<?php echo LNG('undo');?>(Ctrl-Z)"><i class="font-icon icon-undo"></i></a>
<a action="redo" href="javascript:;" title="<?php echo LNG('redo');?>(Ctrl-Y)"><i class="font-icon icon-repeat"></i></a>
<a action="refresh" href="javascript:;" title="<?php echo LNG('refresh');?>(F5)"><i class="font-icon icon-refresh"></i></a>
<span class="line"></span>
<a href="javascript:;" class="toolbar-menu menu-view-goto-line" title="<?php echo LNG('gotoline');?>(Ctrl-L)"><i class="font-icon icon-pushpin"></i></a>
<a action="search" href="javascript:;" title="<?php echo LNG('search');?>(Ctrl-F)"><i class="font-icon icon-search"></i></a>
<a action="searchReplace" href="javascript:;" title="<?php echo LNG('replace');?>(Ctrl-F-F)"><i class="font-icon icon-random"></i></a>
<span class="line"></span>
<a action="font" class="toolbar-menu menu-view-font" href="javascript:;" title="<?php echo LNG('font_size');?>">
<i class="font-icon icon-font"></i><i class="font-icon icon-caret-down"></i>
</a>
<span class="line"></span>
<a class="toolbar-menu menu-view-theme" href="javascript:;" title="<?php echo LNG('code_theme');?>">
<i class="font-icon icon-magic"></i><i class="font-icon icon-caret-down"></i>
</a>
<a class="toolbar-menu menu-view-setting" href="javascript:;" title="<?php echo LNG('setting');?>">
<i class="font-icon icon-cog"></i><i class="font-icon icon-caret-down"></i>
</a>
<a action="preview" href="javascript:;" title="<?php echo LNG('preview');?>(Ctrl-Shift-S)"><i class="font-icon icon-eye-open"></i></a>
</div>
<div class="right">
<a action="fullscreen" href="javascript:;" title="<?php echo LNG('full_screen');?>"><i class="font-icon icon-resize-full"></i></a>
<a action="close" href="javascript:;" title="<?php echo LNG('close');?>"><i class="font-icon icon-remove"></i></a>
</div>
<div style="clear:both"></div>
</div><!-- end tools -->
<!-- 主体部分 -->
<div class="frame-left">
<div class="edit-tab">
<div class="tabs">
<a href="javascript:Editor.add()" class="add icon-plus"></a>
<div style="clear:both"></div>
</div>
</div>
<div class="edit-body">
<div class="introduction hidden">
<?php include(LANGUAGE_PATH.I18n::getType().'/edit.html');?>
<div style="clear:both"></div>
</div>
<div class="tabs"></div>
<div class="bottom-toolbar hidden">
<a class="toolbar-menu menu-view-goto-line editor_position" href="javascript:;">0:0</a>
<a class="file-mode" href="javascript:;">text</a>
<a class="toolbar-menu menuViewTab config-tab" href="javascript:;">Tabs:4</a>
<a class="toolbar-menu menu-view-setting config" href="javascript:;"><i class="font-icon icon-cog"></i></a>
<div style="clear:both"></div>
</div>
</div>
<div class="search-content hidden"></div>
</div>
</div>
<?php include(TEMPLATE.'common/footerCommon.html');?>
<script type="text/javascript">
AUTH = {'explorer.fileDownload':<?php echo $canDownload;?>};
G.fristFile = "<?php echo (isset($_GET['filename']) ? clear_html($_GET['filename']) :'') ;?>";
G.codeConfig = <?php echo $editorConfig;?>;
G.codeThemeAll = "<?php echo $config['settingAll']['codethemeall']?>";
G.codeFontAll = "<?php echo $config['settingAll']['codefontall']?>";
G.user = "<?php echo clear_html($_GET['user']);?>";
G.sid = "<?php echo clear_html($_GET['sid']);?>";
G.theme = "<?php echo $configTheme;?>";
seajs.config({
preload: [
"lib/jquery-1.8.0.min",
'lib/ace/src-min-noconflict/ace'
]
});
seajs.use("app/src/edit/main");
</script>
</body>
</html>
@@ -0,0 +1,58 @@
<?php include(TEMPLATE.'common/header.html');?>
<title><?php echo clear_html($shareInfo['name']).' - '.LNG('share_title').' - '.strip_tags(LNG('kod_name')).LNG('kod_power_by');?></title>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/base/app_editor.css?ver=<?php echo KOD_VERSION;?>"/>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/<?php echo $configTheme;?>.css?ver=<?php echo KOD_VERSION;?>" id='link-theme-style'/>
</head>
<?php if(isset($_GET['project'])){?>
<style>
.topbar{display: none;}
.frame-header,.frame-main,.frame-main .frame-left{top:0;}
.edit-content.markdown-full-page .edit-right-frame .markdown-preview {padding-top: 50px;}
.edit-body {bottom: 30px;}
</style>
<?php } ?>
<?php if(isset($_GET['user'])){?>
<style>
.frame-main .frame-left{top:0;}
.frame-main{bottom:0px;}
</style>
<?php } ?>
<body style="overflow:hidden;" oncontextmenu="return core.contextmenu();" id="page-editor">
<?php include(TEMPLATE.'common/navbarShare.html');?>
<div class="frame-main">
<div class='frame-left'>
<ul id="folder-list-tree" style="margin-top:10px;" class="ztree"></ul>
</div><!-- / frame-left end-->
<div class='frame-resize'></div>
<div class='frame-right'>
<div class="frame-right-main" style="height:100%;padding:0;margin:0;">
<div class="resize-mask"></div>
<div class="message-box"><div class="content"></div></div>
<div class="menu-tree-root"></div>
<div class="menu-tree-folder"></div>
<div class="menu-tree-file"></div>
<div class ='frame'>
<iframe name="OpenopenEditor"
src="./index.php?share/edit&user=<?php echo clear_html($_GET['user']);?>&sid=<?php echo clear_html($_GET['sid']);?>"
style="width:100%;height:100%;border:0;" frameborder=0></iframe>
</div>
</div>
</div><!-- / frame-right end-->
</div><!-- / frame-main end-->
<?php include(TEMPLATE.'common/footerCommon.html');?>
<script type="text/javascript">
AUTH = {'explorer.fileDownload':<?php echo $canDownload;?>};
G.project = "<?php echo (isset($_GET['project'])?clear_html($_GET['project']):'') ;?>";
G.user = "<?php echo clear_html($_GET['user']);?>";
G.sid = "<?php echo clear_html($_GET['sid']);?>";
G.shareInfo = <?php echo json_encode($shareInfo);?>;
G.theme = "<?php echo $configTheme;?>";
seajs.use("app/src/shareEditor/main");
</script>
</body>
</html>
@@ -0,0 +1,54 @@
<?php include(TEMPLATE.'common/header.html');?>
<title><?php echo clear_html($shareInfo['name']).' - '.LNG('share_title').' - '.strip_tags(LNG('kod_name')).LNG('kod_power_by');?></title>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/base/app_explorer.css?ver=<?php echo KOD_VERSION;?>"/>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/<?php echo $configTheme;?>.css?ver=<?php echo KOD_VERSION;?>" id='link-theme-style'/>
</head>
<style>
.frame-main .frame-left {bottom: 0px;}
.frame-main .bottom-box{display:none !important;}
.tools-right #set_theme{display:none !important;}
#PV_rotate_Left,#PV_rotate_Right,#PV_Btn_Remove{display:none !important;}
<?php if(isset($_GET['type'])){?>
.topbar,.common-footer,.bottom-box{display:none;}
.frame-header{top:0;}
.frame-main{top:0px;bottom:0px;}
.frame-main .frame-left #folder-list-tree{bottom:5px;}
<?php if($_GET['type']=="explorer"){?>
.frame-header .header-content .header-left{display:none;}
.frame-header .header-content .header-middle{left:12px;}
.frame-main .frame-left,.frame-main .frame-resize{display:none;}
.frame-main .frame-right{left:0px;}
.task-tab{display:none;}
<?php } ?>
<?php if($_GET['type']=="fileList"){?>
.frame-header{display:none;}
.frame-main .frame-left,.frame-main .frame-resize{display:none;}
.frame-main .frame-right{left:0px;}
.frame-main{top:0px;}
.task-tab,#set_theme,#fav,#home{display:none !important;}
.header-middle{top:3px;left:5px;right:140px;}
#list-type-header{top:35px;}
<?php } ?>
<?php } ?>
</style>
<body style="overflow:hidden;" oncontextmenu="return core.contextmenu();" id="page-explorer">
<?php include(TEMPLATE.'common/navbarShare.html');?>
<?php include(TEMPLATE.'explorer/content.html');?>
<?php include(TEMPLATE.'common/footer.html');?>
<script type="text/javascript" >
AUTH = {'explorer.fileDownload':<?php echo clear_html($canDownload);?>};
G.thisPath = "<?php echo clear_html($dir);?>";
G.user = "<?php echo clear_html($_GET['user']);?>";
G.sid = "<?php echo clear_html($_GET['sid']);?>";
G.shareInfo = <?php echo json_encode($shareInfo);?>;
G.theme = "<?php echo $configTheme;?>";
seajs.use("app/src/shareExplorer/main");
</script>
</body>
</html>
@@ -0,0 +1,59 @@
<?php include(TEMPLATE.'common/header.html');?>
<title><?php echo LNG('ui_explorer').' - '.strip_tags(LNG('kod_name')).LNG('kod_power_by');?></title>
<link href="<?php echo STATIC_PATH;?>style/wap/app_explorer.css?ver=<?php echo KOD_VERSION;?>" rel="stylesheet"/>
</head>
<body>
<div class="frame-main">
<div class="frame-header">
<div class="title"><?php echo clear_html($shareInfo['name']);?></div>
<div class="menu-group">
<div class="btn-list-icon"><i class="font-icon icon-home"></i></div>
</div>
</div>
<div class="address">
<ul class="yarnball"></ul>
<div style="clear: both"></div>
</div>
<div class='bodymain'>
<div class="file-continer file-list-list"></div>
</div>
<div class="file-menu">
<div class="file-action-menu hidden">
<div class='action-menu' data-action="action-download"><i class="font-icon icon-info"></i><?php echo LNG('download');?></div>
<div class='action-menu' data-action="action-share-open">
<span class="content">
<i class="font-icon icon-share"></i><?php echo LNG('open');?>
</span>
</div>
<div class="menu-close"><i class="font-icon icon-ellipsis-horizontal"></i></div>
<div style="clear:both"></div>
</div>
</div>
<?php include(TEMPLATE.'common/footer.html');?>
</div><!-- / frame-main end-->
<div class="toolbar-menu">
<button class="menu-plus tool tool-menu-right-btn" data-toggle="dropdown"></button>
<ul class="dropdown-menu tool-menu-right pull-right animated menuShow" role="menu" >
<li data-action="upload"><a href="javascript:void();">
<i class="font-icon icon-cloud-upload"></i><?php echo LNG('upload');?></a></li>
<li data-action="newfolder"><a href="javascript:void();">
<i class="font-icon icon-folder-close-alt"></i><?php echo LNG('newfolder');?></a></li>
<li data-action="newfile"><a href="javascript:void();">
<i class="font-icon icon-file-text"></i><?php echo LNG('newfile');?></a></li>
<li data-action="past"><a href="javascript:void();">
<i class="font-icon icon-paste"></i><?php echo LNG('past');?></a></li>
<li data-action="search"><a href="javascript:void();">
<i class="font-icon icon-search"></i><?php echo LNG('search');?></a></li>
</ul>
</div>
<script type="text/javascript">
G.thisPath = "<?php echo clear_html($dir);?>";
G.user = "<?php echo clear_html($_GET['user']);?>";
G.sid = "<?php echo clear_html($_GET['sid']);?>";
G.shareInfo = <?php echo json_encode($shareInfo);?>;
seajs.use("<?php echo STATIC_JS;?>/src/explorerWap/main");
</script>
</body>
</html>
+45
View File
@@ -0,0 +1,45 @@
<?php include(TEMPLATE.'common/header.html');?>
<title><?php echo clear_html($shareInfo['name']).' - '.LNG('share_title').' - '.strip_tags(LNG('kod_name')).LNG('kod_power_by');?></title>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/base/app_code_edit.css?ver=<?php echo KOD_VERSION;?>"/>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/<?php echo $configTheme;?>.css?ver=<?php echo KOD_VERSION;?>" id='link-theme-style'/>
</head>
<style type="text/css">
.frame-main{bottom: 32px;}
</style>
<body>
<?php include(TEMPLATE.'common/navbarShare.html');?>
<div class="frame-main share-page-main">
<!-- bindary-box -->
<div class="bindary-box hidden">
<div class="title"><div class="ico"></div></div>
<div class="content-info">
<div class="name"></div>
<div class="size"><span></span><i class="share-time"></i></div>
<div class="btn-group">
<a type="button" class="btn btn-primary btn-download" href=""><?php echo LNG('download');?></a>
</div>
<div class="error-tips"><?php echo LNG('share_error_show_tips');?></div>
</div>
</div>
<div class="content-box"></div>
</div><!-- / frame-main end-->
<?php include(TEMPLATE.'common/footer.html');?>
<script type="text/javascript">
AUTH = {'explorer.fileDownload':<?php echo $canDownload;?>};
G.user = "<?php echo clear_html($_GET['user']);?>";
G.path = "<?php echo clear_html($_GET['path']);?>";
G.sid = "<?php echo clear_html($_GET['sid']);?>";
G.shareInfo = <?php echo json_encode($shareInfo);?>;
G.theme = "<?php echo $configTheme;?>";
seajs.config({
preload: [
"lib/jquery-1.8.0.min",
'lib/ace/src-min-noconflict/ace'
]
});
seajs.use("app/src/shareIndex/main");
</script>
</body>
</html>
+26
View File
@@ -0,0 +1,26 @@
<?php include(TEMPLATE.'common/header.html');?>
<title>tips - <?php echo LNG('share_title').' - '.strip_tags(LNG('kod_name')).LNG('kod_power_by');?></title>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/base/app_code_edit.css?ver=<?php echo KOD_VERSION;?>"/>
<link rel="stylesheet" href="<?php echo STATIC_PATH;?>style/skin/<?php echo $configTheme;?>.css?ver=<?php echo KOD_VERSION;?>" id='link-theme-style'/>
</head>
<body style="overflow:hidden;">
<?php include(TEMPLATE.'common/navbarShare.html');?>
<div class="frame-main">
<?php if($msg=='password'){?>
<div class="share-page-passowrd">
<div class="title"><?php echo LNG('share_password');?></div>
<input type="password" class="form-control"/>
<a href="javascript:void(0);" class="btn btn-primary share-login"><?php echo LNG('button_ok');?></a>
</div>
<?php }else{?>
<div class="share-page-error"><b>tips:</b><?php echo $msg;?></div>
<?php }?>
</div><!-- / frame-main end-->
<?php include(TEMPLATE.'common/footer.html');?>
<script type="text/javascript">
seajs.use("app/src/shareIndex/main");
</script>
</body>
</html>
@@ -0,0 +1,63 @@
<?php include(TEMPLATE.'common/header.html');?>
<link href="<?php echo STATIC_PATH;?>style/login.css?ver=<?php echo KOD_VERSION;?>" rel="stylesheet">
<title><?php echo LNG('php_env_check').' - '.strip_tags(LNG('kod_name')).LNG('kod_power_by');?></title>
</head>
<body>
<?php echo pageBackground();?>
<div class="background"></div>
<div class="loginbox box-install aero" >
<div class="title">
<div class="logo"><i class="icon-cloud"></i><?php echo strip_tags(LNG('kod_name'));?></div>
<div class='info'><?php echo LNG('kod_name_desc');?></div>
<div class="menu-group">
<a id='footer-language' data-toggle="dropdown" href="javascript:void(0);" class="topbar-menu">
<i class='font-icon icon-flag'></i>Language<b class="caret"></b>
</a>
<ul class="dropdown-menu footer-language pull-left animated menuShow" role="menu" aria-labelledby="footer-language">
<?php
$tpl = "";
foreach ($config['settingAll']['language'] as $key => $value) {
$name = $value[0];
$select = I18n::getType() == $key ? "this":"";
$tpl .= "<li><a href='javascript:core.language(\"{$key}\");' title=\"{$key}/{$value[1]}/{$value[2]}\" class='{$select}'><i class='lang-flag flag-{$key}'></i>{$name}</a></li>";
}
echo $tpl;
?>
</ul>
</div>
</div>
<div class="form" style="padding: 10px 20px 40px 20px;">
<h3><?php echo LNG('php_env_check');?></h3>
<?php
$error = php_env_check();
$login = LNG('login');
if ($error=='') {
echo '<div class="success">';
}else{
echo '<div class="error"><h4>error:</h4>'.$error."<br/>";
$login = LNG('php_env_error_ignore');
}
$login_info = str_replace(array("{0}","{1}","{2}"),array('admin','demo/demo','guest/guest'),LNG('install_user_default'));
echo LNG('install_login'),'<br/>'.$login_info.'</div>';
echo '<div class="inputs admin-password"><input type="password" placeholder="'.LNG('login_root_password').'"/></div><div class="inputs admin-password-repeat"><input type="password" placeholder="'.LNG('login_root_password_repeat').'"/></div>';
echo '<div class="guest"><a href="javascript:void(0);" class="start">'.$login.'</a></div>';
?>
</div>
</div>
<?php $GLOBALS['loadCommonJs'] = true;?>
<?php include(TEMPLATE.'common/footer.html');?>
<script type="text/javascript" >
setTimeout(function(){
if( typeof(seajs) == 'undefined' ||
typeof(LNG) == 'undefined'
){
alert('js文件不完整,请查看浏览器控制台和服务器配置是否正常。或检查文件是否被修改(或咨询主机商压缩js导致文件损坏);[js load error!]');
}
},1000);
seajs.use("<?php echo STATIC_JS;?>/src/user/main");
</script>
</body>
</html>
@@ -0,0 +1,30 @@
<?php include(TEMPLATE.'common/header.html');?>
<title><?php echo 'License Register - '.strip_tags(LNG('kod_name')).LNG('kod_power_by');?></title>
<link href="<?php echo STATIC_PATH;?>style/login.css?ver=<?php echo KOD_VERSION;?>" rel="stylesheet">
</head>
<body class="license-page">
<?php echo pageBackground();?>
<div class="background"></div>
<div class="loginbox aero" >
<div class="title">
<div class="logo">升级为商业版</div>
<div class='info'><?php echo LNG('copyright_contact');?></div>
</div>
<div class="form" style="padding: 10px 20px;">
<div class="inputs admin-password"><input type="text" placeholder="LICENSE KEY"/></div>
<a href="javascript:void(0);" class="LICENSE_SUBMIT btn btn-primary">注册授权</a>
<div class="links">
<a href="./index.php?user/versionInstall&reset=1" class="btn btn-link license-use-free"><?php echo LNG('use_free');?></a>
<a href="http://kodcloud.com/buy.html#<?php echo I18n::getType();?>" target="_blank" class="btn btn-link license-learn-more"><?php echo LNG('learn_more');?></a>
</div>
<br/>
</div>
</div>
<?php $GLOBALS['loadCommonJs'] = true;?>
<?php include(TEMPLATE.'common/footer.html');?>
<script type="text/javascript" >
seajs.use("<?php echo STATIC_JS;?>/src/user/main");
</script>
</body>
</html>
+91
View File
@@ -0,0 +1,91 @@
<!--user login-->
<?php include(TEMPLATE.'common/header.html');?>
<title><?php echo strip_tags(LNG('kod_name')).LNG('kod_power_by');?></title>
<link href="<?php echo STATIC_PATH;?>style/login.css?ver=<?php echo KOD_VERSION;?>" rel="stylesheet">
</head>
<body>
<?php echo pageBackground();?>
<div class="background"></div>
<div class="init-loading"><div><img src="<?php echo STATIC_PATH;?>images/common/loading_simple.gif?v=<?php echo KOD_VERSION;?>"/></div></div>
<div class="loginbox animated-500 fadeInDown aero" >
<div class="title">
<div class="logo"><i class="icon-cloud"></i><?php echo strip_tags(LNG('kod_name'));?></div>
<div class='info'><?php echo LNG('kod_name_desc');?></div>
<?php if(!isset($config['settings']['language'])){ ?>
<div class="menu-group">
<a id='footer-language' data-toggle="dropdown" href="javascript:void(0);" class="topbar-menu">
<i class='font-icon icon-flag'></i>Language<b class="caret"></b>
</a>
<ul class="dropdown-menu footer-language pull-left animated menuShow" role="menu" aria-labelledby="footer-language">
<?php
$tpl = "";
foreach ($config['settingAll']['language'] as $key => $value) {
$name = $value[0];
$select = I18n::getType() == $key ? "this":"";
$tpl .= "<li><a href='javascript:core.language(\"{$key}\");' title=\"{$key}/{$value[1]}/{$value[2]}\" class='{$select}'><i class='lang-flag flag-{$key}'></i>{$name}</a></li>";
}
echo $tpl;
?>
</ul>
</div>
<?php } ?>
</div>
<div class="form">
<form action="#">
<div class="inputs">
<div>
<i class="font-icon icon-user"></i>
<input id="username" name='name' type="text" placeholder="<?php echo LNG('username');?>"
required autocomplete="on" disabled/>
</div>
<div>
<i class="font-icon icon-key"></i>
<input id="password" name='password' type="password" placeholder="<?php echo LNG('password');?>"
required autocomplete="on" disabled/>
<input type='hidden' name='csrfLogin' value="<?php echo $_SESSION['csrfLogin'];?>"/>
</div>
<?php if(need_check_code()){?>
<div class='check-code'>
<i class="font-icon icon-unlock-alt"></i>
<input name='checkCode' class="check-code" type="text" placeholder="<?php echo LNG('login_code');?>" required/>
<img src='./index.php?user/checkCode' onclick="this.src='./index.php?user/checkCode'" />
</div>
<?php }?>
</div>
<div class="actions">
<label for='rm'>
<input type="checkbox" class="checkbox" name="rememberPassword" id='rm'/>
<?php echo LNG('login_rember_password');?>
</label>
<a href="javascript:void(0);" class="forget-password"><?php echo LNG('forget_password');?></a>
<br/>
<input type="submit" id="submit" value="<?php echo LNG('login');?>" />
</div>
<div class="msg"><?php echo $msg;?></div>
<?php if ($this->config['settingSystem']['autoLogin'] == '1') {?>
<div class='guest'>
<a href="./index.php?user/loginSubmit&name=guest&password=guest"><?php echo LNG('guest_login');?><i class=' icon-arrow-right'></i></a>
</div>
<?php } ?>
</form>
</div>
</div>
<?php $GLOBALS['loadCommonJs'] = true;?>
<?php include(TEMPLATE.'common/footer.html');?>
<script type="text/javascript" >
setTimeout(function(){
if( typeof(seajs) == 'undefined' ||
typeof(LNG) == 'undefined'
){
alert('js文件不完整,请查看浏览器控制台和服务器配置是否正常。或检查文件是否被修改(或咨询主机商压缩js导致文件损坏);[js load error!]');
}
},1000);
seajs.use("<?php echo STATIC_JS;?>/src/user/main");
</script>
</body>
</html>
@@ -0,0 +1,65 @@
<!--user login-->
<?php include(TEMPLATE.'common/header.html');?>
<link href="<?php echo STATIC_PATH;?>style/wap/login.css?ver=<?php echo KOD_VERSION;?>" rel="stylesheet">
<title><?php echo strip_tags(LNG('kod_name')).LNG('kod_power_by');?></title>
</head>
<body>
<?php echo pageBackground();?>
<div class="background"></div>
<div class="loginbox login-wap aero" >
<div class="title">
<div class="logo">
<i class="icon-cloud"></i><?php echo strip_tags(LNG('kod_name'));?>
</div>
<div class='info'><?php echo LNG('kod_name_desc');?></div>
</div>
<div class="form">
<form action="#">
<div class="inputs">
<div>
<i class="font-icon icon-user"></i>
<input id="username" name='name' type="text" placeholder="<?php echo LNG('username');?>"
required disabled/>
</div>
<div>
<i class="font-icon icon-key"></i>
<input id="password" name='password' type="password" placeholder="<?php echo LNG('password');?>"
required disabled/>
<input type='hidden' name='csrfLogin' value="<?php echo $_SESSION['csrfLogin'];?>"/>
</div>
<?php if(need_check_code()){?>
<div class='check-code'>
<i class="font-icon icon-unlock-alt"></i>
<input name='checkCode' class="check-code" type="text" placeholder="<?php echo LNG('login_code');?>" required/>
<img src='./index.php?user/checkCode' onclick="this.src='./index.php?user/checkCode'" />
</div>
<?php }?>
</div>
<div class="actions">
<label for='rm'>
<input type="checkbox" class="checkbox" name="rememberPassword" id='rm'/>
<?php echo LNG('login_rember_password');?>
</label>
<a href="javascript:void(0);" class="forget-password"><?php echo LNG('forget_password');?></a>
<input type="submit" id="submit" value="<?php echo LNG('login');?>" />
</div>
<div class="msg"><?php echo $msg;?></div>
<?php if ($this->config['settingSystem']['autoLogin'] == '1') {?>
<div class='guest'>
<a href="./index.php?user/loginSubmit&name=guest&password=guest"><?php echo LNG('guest_login');?><i class=' icon-arrow-right'></i></a>
</div>
<?php } ?>
</form>
</div>
</div>
<?php $GLOBALS['loadCommonJs'] = true;?>
<?php include(TEMPLATE.'common/footer.html');?>
<script type="text/javascript" >
seajs.use("<?php echo STATIC_JS;?>/src/user/main");
</script>
</body>
</html>
+116
View File
@@ -0,0 +1,116 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
define('GLOBAL_DEBUG',0);//0 or 1
define('GLOBAL_DEBUG_HOOK',0);//0 or 1
@date_default_timezone_set(@date_default_timezone_get());
@set_time_limit(1200);//20min pathInfoMuti,search,upload,download...
@ini_set("max_execution_time",1200);
@ini_set('memory_limit','500M');//
@ini_set('session.cache_expire',1800);
if(GLOBAL_DEBUG){
define('STATIC_JS','_dev'); //_dev||app
define('STATIC_LESS','less');//less||css
@ini_set("display_errors","on");
@error_reporting(E_ALL^E_NOTICE^E_WARNING^E_DEPRECATED);//
}else{
define('STATIC_JS','app'); //app
define('STATIC_LESS','css');//css
@ini_set("display_errors","on");//on off
@error_reporting(E_ALL^E_NOTICE^E_WARNING^E_DEPRECATED);// 0
}
//header('HTTP/1.1 200 Ok');//兼容部分lightHttp服务器环境; php5.1以下会输出异常;暂屏蔽
header("Content-type: text/html; charset=utf-8");
define('BASIC_PATH',str_replace('\\','/',dirname(dirname(__FILE__))).'/');
define('LIB_DIR', BASIC_PATH .'app/'); //系统库目录
define('PLUGIN_DIR', BASIC_PATH .'plugins/'); //插件目录
define('CONTROLLER_DIR',LIB_DIR .'controller/'); //控制器目录
define('MODEL_DIR', LIB_DIR .'model/'); //模型目录
define('TEMPLATE', LIB_DIR .'template/'); //模版文件路径
define('FUNCTION_DIR', LIB_DIR .'function/'); //函数库目录
define('CLASS_DIR', LIB_DIR .'kod/'); //工具类目录
define('CORER_DIR', LIB_DIR .'core/'); //核心目录
define('SDK_DIR', LIB_DIR .'sdks/'); //
define('DEFAULT_PERRMISSIONS',0755); //新建文件、解压文件默认权限,777 部分虚拟主机限制了777;
/*
* 可以数据目录;移到web目录之外,可以使程序更安全, 就不用限制用户的扩展名权限了;
* 1. 需要先将data文件夹移到别的地方 例如将data文件夹拷贝到D:/
* 2. 在config文件夹下新建define.php 新增一行 <?php define('DATA_PATH','D:/data/');
* 注意:路径不能写错;其次php需要有权限访问移动后的目录(设置了防跨站需要关闭) 路径结尾/斜杠绝对不能缺少
*/
if(file_exists(BASIC_PATH.'config/define.php')){
include(BASIC_PATH.'config/define.php');
}
if(!defined('DATA_PATH')){
define('DATA_PATH',BASIC_PATH .'data/'); //用户数据目录
}
define('USER_PATH', DATA_PATH .'User/'); //用户目录
define('GROUP_PATH', DATA_PATH .'Group/'); //群组目录
define('USER_SYSTEM', DATA_PATH .'system/'); //用户数据存储目录
define('TEMP_PATH', DATA_PATH .'temp/'); //临时目录
define('LOG_PATH', TEMP_PATH .'log/'); //日志
define('DATA_THUMB', TEMP_PATH .'thumb/'); //缩略图生成存放
define('LANGUAGE_PATH', BASIC_PATH .'config/i18n/');//多语言目录
define('SESSION_ID','KOD_SESSION_ID_'.substr(md5(BASIC_PATH),0,5));
define('KOD_SESSION', DATA_PATH .'session/'); //session目录
include(FUNCTION_DIR.'common.function.php');
include(FUNCTION_DIR.'web.function.php');
include(FUNCTION_DIR.'file.function.php');
include(FUNCTION_DIR.'helper.function.php');
include(CLASS_DIR.'I18n.class.php');
include(BASIC_PATH.'config/version.php');
check_cache();
$config['appStartTime'] = mtime();
$config['appCharset'] = 'utf-8';//该程序整体统一编码
$config['checkCharset'] = 'ASCII,UTF-8,GB2312,GBK,BIG5,UTF-16,UCS-2,'.
'Unicode,EUC-KR,EUC-JP,SHIFT-JIS,EUCJP-WIN,SJIS-WIN,JIS,LATIN1';//文件打开自动检测编码
$config['checkCharsetDefault'] = '';//if set,not check;
//when edit a file ;check charset and auto converto utf-8;
if (strtoupper(substr(PHP_OS, 0,3)) === 'WIN') {
$config['systemOS']='windows';
$config['systemCharset']='gbk';// EUC-JP/Shift-JIS/BIG5 //user set your server system charset
if(version_compare(phpversion(), '7.1.0', '>=')){//7.1 has auto apply the charset
$config['systemCharset']='utf-8';
}
} else {
$config['systemOS']='linux';
$config['systemCharset']='utf-8';
}
// 部分反向代理导致获取不到url的问题优化;忽略同域名http和https的情况
if(isset($_COOKIE['APP_HOST'])){
if( get_url_domain($_COOKIE['HOST']) != get_url_domain($_COOKIE['APP_HOST']) ||
get_url_scheme($_COOKIE['HOST']) == get_url_scheme($_COOKIE['APP_HOST']) ){
define('HOST',$_COOKIE['HOST']);
define('APP_HOST',$_COOKIE['APP_HOST']);
}
}
if(!defined('HOST')){ define('HOST',rtrim(get_host(),'/').'/');}
if(!defined('WEB_ROOT')){ define('WEB_ROOT',webroot_path(BASIC_PATH) );}
if(!defined('APP_HOST')){ define('APP_HOST',HOST.str_replace(WEB_ROOT,'',BASIC_PATH));} //程序根目录
define('PLUGIN_HOST',APP_HOST.str_replace(BASIC_PATH,'',PLUGIN_DIR));//插件目录
include(CONTROLLER_DIR.'utils.php');
include(BASIC_PATH.'config/setting.php');
if (file_exists(BASIC_PATH.'config/setting_user.php')) {
include_once(BASIC_PATH.'config/setting_user.php');
}
if(file_exists(CONTROLLER_DIR.'debug.class.php')){
include_once(CONTROLLER_DIR.'debug.class.php');
}
init_common();
$config['autorun'] = array(
array('controller'=>'user','function'=>'loginCheck'),
array('controller'=>'user','function'=>'authCheck'),
array('controller'=>'user','function'=>'bindHook'),
);
+33
View File
@@ -0,0 +1,33 @@
<div class="box">
<div class="title"><span>KODExplorer غير ماذا؟</span></div>
<p>KODExplorer هو إدارة الوثائق على الانترنت على شبكة الإنترنت مفتوح المصدر، محرر التعليمات البرمجية. ويوفر نوعا من النوافذ الكلاسيكية واجهة المستخدم، ومجموعة من إدارة الوثائق على الانترنت، ومعاينة ملف، تحرير، تحميل وتنزيل، بفك الانترنت تشغيل الموسيقى. يسمح لك لتحقيق التنمية على شبكة الإنترنت مباشرة في المتصفح، وشفرة المصدر معاينة الملف، ونشر صاحب الموقع والعملية المحلية وسهلة وسريعة وتجربة آمنة.</p>
<p><b>- تصميم -</b></p>
<p>التقاليد الكلاسيكية، والسعي للابتكار، لتزويد المستخدمين مع مريحة، آمنة وسهلة لاستخدام نظام إدارة سحابة على الانترنت.</p>
<p>كلما (متى)، حيث (حيث)، لديه شبكة الإنترنت كلما تريد (تريد) هو أداة لإدارة الخاص بك (4W السياسة).</p>
<p><b>- المستخدم المنحى -</b></p>
<p>حاليا نظام إدارة KODExplorer تقع أساسا في سحابة استضافة شخصية، صغير إدارة المشاريع سحابة الموارد وإدارة القرص الشبكة، وإدارة المواقع الصغيرة والمتوسطة. مطور ويب و الماجستير (قدامى المحاربين): محرر على الانترنت، والنسخ الاحتياطي مضغوط، نشر، الكلاسيكية تشغيل ويندوز واجهة، من السهل أن تبدأ وتخلص من SSH المضيف، الأمر FTP عمليات الحفر معقدة.</p>
<p>سحابة شخصية خاصة (الصاعد): موارد القرص شبكة الإدارية، ونفس العملية النوافذ الكلاسيكية واجهة، يمكنك وضع محرك الأقراص الموسيقى تصفح الشبكة، وملفات الشاشة، تحميل وتنزيل بسرعة وسهولة.</p>
</div>
<div class="box">
<div class="title"><span>ميزات</span></div>
<p>إدارة ثيقة شاملة وقوية محرر الملفات على الإنترنت</p>
<p>أينما كنت، يمكنك إدارة الملفات الخاصة بك، والترفيه عبر الإنترنت، على شبكة الإنترنت كتابة رمز! تماما كما مناسبة للاستخدام في نظام التشغيل.</p>
<p>واسعة النطاق بحق عملية تجربة زرع المحلي، السحب، مربع التحديد، اختصارات، البحث عن الملفات (المحتوى البحث) ......</p>
<p>مربع الاختيار، السحب الحركة، وسحب وإسقاط تحميل، محرر على الانترنت، ومشغل فيديو، ضغط. كامل الأداء ضمان اياكس والخبرة!</p>
<p>كل وظيفة الربط السلس المباشر، في شكل حوار، وظائف إدارة متعددة المهام</p>
<p>محرر يدعم-متعددة وثيقة، ودعم ZendCoding أتش تي أم أل، المغلق، شبيبة أعلى الترميز الكفاءة!</p>
<p>الدعم الصيني الكمال، مشوه حل حالات مختلفة؛</p>
</div>
<div class="box">
<div class="title"><span>المصدر المفتوح اعتماد التكنولوجيا</span></div>
<p><b>1.Jquery:</b>jpuery (المساعد: Hotkeys.ztree.contentmenu) شبيبة إطار التنمية السائد. تشغيل عملية دوم، BOM، عملية المغلق، وحزمة اياكس</p>
<p><b>2.ArtDialog:</b>تصميم جميل، والتوافق متصفح قوي القطعة الحوار. لذا المنبثقة مقبض، والأحداث، ونقل البيانات للحصول على إدارة أفضل موحدة</p>
<p><b>3.Ztree:</b>شجرة التحكم القائمة، والتدرجية هو جدا قوية شجرة معالجة البيانات القطعة</p>
<p><b>4.codemirror:</b>محرر كود شبيبة الإضافات، ويدعم مجموعة متنوعة من لغات البرمجة لتسليط الضوء على</p>
<p><b>5.zendcoding:</b>على رموز الدعم أتش تي أم أل الكتابة بسرعة المكونات الإضافية. يبسط يتم كتابة تعريف من التعليمات البرمجية. تجميع بسيط</p>
<p><b>6.less:</b>نموذج تنمية المغلق كفاءة وظيفية لتحسين الواجهة الأمامية المغلق إعادة استخدام . تجميع بسيط</p>
<p><b>7.SWFUpload:</b>ملف فلاش تحميل</p>
<p><b>8 .CMP4:</b>لاعب فلاش جيد جدا المساعد ملفات الوسائط، ودعم تدفق وسائل الاعلام، شعبية أداة تشغيل الموسيقى والفيديو. دعم للبشرة، وإعدادات شكلي للغاية. قائمة ديناميكية أكس تحميل. رسائل الوسائط المتعددة تدفق وسائل الاعلام، RSTP رخصة مفتوحة المصدر دعم تشغيل الوسائط</p>
</div>
+72
View File
@@ -0,0 +1,72 @@
<div class="intro-left" style=";text-align:right;direction:rtl">
<div class="tips blue" style=";text-align:right;direction:rtl">
<h1 style=";text-align:right;direction:rtl"> <span>الوظائف الغنية</span> </h1>
<p style=";text-align:right;direction:rtl"> كود يطالب تلقائيا </p>
<p style=";text-align:right;direction:rtl"> متعددة موضوع: اختيار أسلوب البرمجة المفضلة لديك </p>
<p style=";text-align:right;direction:rtl"> الخط مخصص: للاستخدام في المشهد </p>
<p style=";text-align:right;direction:rtl"> تحرير المؤشر متعددة، كتلة التحرير على الانترنت خبرة في البرمجة مماثلة للسامية </p>
<p style=";text-align:right;direction:rtl"> كتلة قابلة للطي، التوسع؛ التفاف </p>
<p style=";text-align:right;direction:rtl"> دعم العديد من علامات التبويب، اسحب تسلسل التبديل. </p>
<p style=";text-align:right;direction:rtl"> الحفاظ على وثائق متعددة، والعثور على واستبدال، التاريخ؛ </p>
<p style=";text-align:right;direction:rtl"> الإكمال التلقائي []، {}، ()، &#39;&#39; &#39;&#39; </p>
<p style=";text-align:right;direction:rtl"> على الانترنت المعاينة في الوقت الحقيقي الذي يسمح لك أن تقع في الحب مع البرمجة على الانترنت! </p>
<p style=";text-align:right;direction:rtl"> zendcodeing الدعم، كتابة التعليمات البرمجية ثمانين </p>
<p style=";text-align:right;direction:rtl"> المزيد من الميزات انتظار اكتشاف الخاص بك ...... </p>
</div>
<div class="tips orange" style=";text-align:right;direction:rtl">
<h1 style=";text-align:right;direction:rtl"> <span>150 نوعا من تسليط الضوء على كود</span> </h1>
<p style=";text-align:right;direction:rtl"> نصيحة: أتش تي أم أل، وجافا سكريبت، المغلق، أقل، ساس، SCSS </p>
<p style=";text-align:right;direction:rtl"> تطوير الشبكة: PHP، بيرل، بيثون، روبي، elang، انتقل ... </p>
<p style=";text-align:right;direction:rtl"> اللغات التقليدية: جافا، C و C ++، C #، أكشن، فبسكريبت ... </p>
<p style=";text-align:right;direction:rtl"> البعض: تخفيض السعر، قذيفة، مزود، لوا، أكس، YAML ... </p>
</div>
</div>
<div class="intro-right" style=";text-align:right;direction:rtl">
<div class="tips green" style=";text-align:right;direction:rtl">
<h1 style=";text-align:right;direction:rtl"> <span>عمل اختصار</span> </h1>
<pre style=";text-align:right;direction:rtl"> الاختصارات المستخدمة شيوعا:
CTRL + S لحفظ
+ السيطرة على اختيار كل CTRL + X قص
CTRL + C CTRL + V لصق نسخة
CTRL + Z التراجع عن التراجع عن مكافحة CTRL + Y
CTRL + F للبحث عن استبدال CTRL + و + و
فوز + ALT + 0 انهيار كل فوز + Alt + العالي + 0 توسيع جميع
ESC [بحث الخروج تلقائيا إلغاء يطالب ...]
السيطرة التحول ليالي معاينة
السيطرة التحول الإلكتروني تظهر وإغلاق وظيفة
</pre>
<pre style=";text-align:right;direction:rtl"> اختيار:
سرادق الماوس - السحب
تحول + الوطن / نهاية / أعلى / يسار / أسفل / الحق
تحول + PAGEUP / بين pagedown الوجه صعودا وهبوطا لتحديد
السيطرة تحول + + الوطن / نهاية المؤشر الحالي إلى بداية ونهاية
ALT + الماوس لسحب اختيار كتلة
CTRL + ALT + ز دفعة حدد وأدخل محرر متعدد التبويب الحالي
</pre>
<pre style=";text-align:right;direction:rtl"> المؤشر:
الوطن / نهاية / أعلى / يسار / أسفل / الحق
CTRL + الوطن / نهاية تحريك المؤشر إلى الوثيقة رأس / ذيل
CTRL + ص الانتقال إلى العلامة مطابقة
PAGEUP / بين pagedown المؤشر صعودا وهبوطا
ALT + المؤشر الأيسر / الأيمن للانتقال إلى أعلى من خط
تحول + المؤشر الأيسر / الأيمن إلى نهاية السطر و
السيطرة + لتر إلى القفز إلى صف معين
CTRL + ALT + لأعلى / أسفل (أدناه) زيادة المؤشر
</pre>
<pre style=";text-align:right;direction:rtl"> تحرير:
CTRL + / تعليق والسيطرة غير تعليق + ALT + وبرر
علامة التبويب جدول محاذاة التحول + طاولة التقدم الشامل
حذف حذف حذف السيطرة خط كامل + د
السيطرة + حذف لحذف الصف والكلمة الصحيحة
السيطرة / التحول + BACKSPACE لحذف كلمة على اليسار
SHIFT + ALT + أعلى / أسفل، وأضاف إلى خط النسخ (أدناه) طائرة
ALT + DELETE لحذف محتويات يمين المؤشر
بديل + أعلى / أسفل على السطر الحالي والخط (تبادل السطر التالي)
CTRL + SHIFT + د صفوف نسخ وإضافة إلى ما يلي
السيطرة + حذف لحذف يمين الكلمة
السيطرة تحول + + يو تحويلها إلى أحرف صغيرة
CTRL + ش النص المحدد إلى أحرف كبيرة
</pre>
</div>
</div>
+36
View File
@@ -0,0 +1,36 @@
<div class="box" style=";text-align:right;direction:rtl">
<div class="title" style=";text-align:right;direction:rtl"> <span>إدارة ملف</span> </div>
<p style=";text-align:right;direction:rtl"><i class="icon-tags"></i> اختيار ملف: راديو، سرادق الماوس، وتحول الانتخابات، السيطرة اختيارهم عشوائيا، لوحة المفاتيح صعودا وهبوطا، المنزل، واختيار نهاية. </p>
<p style=";text-align:right;direction:rtl"><i class="icon-folder-open"></i> تشغيل ملف: بعد اختيار الملف، يمكنك نسخ، قص، حذف، عرض خصائص ضغط، إعادة تسمية، ومعاينة المفتوحة وغيرها من العمليات ...... </p>
<p style=";text-align:right;direction:rtl"><i class="icon-cloud-upload"></i> تحميل الملف: تحميل ملفات متعددة دفعة، HTML5 تحميل السحب (سحب للتحميل بسهولة النافذة، سحب وإسقاط الدعم للمجلدات) </p>
<p style=";text-align:right;direction:rtl"><i class="icon-cogs"></i> وظيفة الصحيحة: بزر الماوس الأيمن ملف أو مجلد، الحق، الحق أكثر بعد العملية الانتخابية، سطح المكتب، والحق، والحق شجرة الدليل، اختصارات القائمة ملزمة اليمين <br/>
(حدد الكل - نسخ - قص - لصق - حذف - إعادة تسمية، تعيين ......) </p>
<p style=";text-align:right;direction:rtl"><i class="icon-sitemap"></i> متصفح ملف: وضع قائمة، وضع رمز، انقر نقرا مزدوجا فوق في مجلدات فرعية، عملية شريط العنوان؛ فتح سجل سجل مجلد مناقضة (إلى الأمام والخلف) </p>
<p style=";text-align:right;direction:rtl"><i class="icon-move"></i> دعم السحب والإسقاط: تحقق من السحب، وقطع لتحقيق وظيفة المجلد المحدد </p>
<p style=";text-align:right;direction:rtl"><i class="icon-reply"></i> مفاتيح الاختصار: حذف حذف، CTRL + A تحديد الكل، CTRL + C لنسخ، + X قص، بحث ملف (محتوى البحث) السيطرة </p>
</div>
<div class="box" style=";text-align:right;direction:rtl">
<div class="title" style=";text-align:right;direction:rtl"> <span>معاينة ملف</span> </div>
<p style=";text-align:right;direction:rtl"><i class="icon-edit"></i> معاينة الملف: عرض محتويات ملف تحرير النص والادخار، أتش تي أم أل، معاينة ملف فرنك سويسري، </p>
<p style=";text-align:right;direction:rtl"><i class="icon-picture"></i> معاينة الصورة: الجيل التلقائي للصور المصغرة، صورة عرض الشرائح. </p>
<p style=";text-align:right;direction:rtl"><i class="icon-music"></i> تشغيل الصوت: تشغيل الموسيقى على الانترنت وملفات الفيديو؛ دعم MP3، WMA، منتصف، AAC، WAV، MP4، </p>
<p style=";text-align:right;direction:rtl"><i class="icon-play"></i> فيديو: تشغيل الفيديو عبر الإنترنت، الصيغ المدعومة: FLV، F4V، 3GP </p>
<p style=";text-align:right;direction:rtl"><i class="icon-play"></i> المكتب: مكتب معاينة الانترنت، الصيغ المدعومة: وثيقة، docx، باور بوينت، PPTX، XLS، XLSX </p>
</div>
<div class="box" style=";text-align:right;direction:rtl">
<div class="title" style=";text-align:right;direction:rtl"> <span>الاختصارات</span> </div>
<p style=";text-align:right;direction:rtl"><i class="icon-tags"></i> إدخال المفتوحة </p>
<p style=";text-align:right;direction:rtl"><i class="icon-tags"></i> + السيطرة مختارة جميع </p>
<p style=";text-align:right;direction:rtl"><i class="icon-tags"></i> CTRL + C لنسخ المحدد </p>
<p style=";text-align:right;direction:rtl"><i class="icon-tags"></i> CTRL + V للصق </p>
<p style=";text-align:right;direction:rtl"><i class="icon-tags"></i> CTRL + X قص </p>
<p style=";text-align:right;direction:rtl"><i class="icon-tags"></i> CTRL + F للبحث في الدليل الحالي </p>
<p style=";text-align:right;direction:rtl"><i class="icon-tags"></i> بديل + ن ملف جديد </p>
<p style=";text-align:right;direction:rtl"><i class="icon-tags"></i> ALT + م مجلد جديد </p>
<p style=";text-align:right;direction:rtl"><i class="icon-tags"></i> حذف حذف المحدد </p>
<p style=";text-align:right;direction:rtl"><i class="icon-tags"></i> مسافة للخلف العودة </p>
<p style=";text-align:right;direction:rtl"><i class="icon-tags"></i> CTRL + مسافة للخلف إلى الأمام </p>
<p style=";text-align:right;direction:rtl"><i class="icon-tags"></i> F2 إعادة تسمية مختارة (مجلد) </p>
<p style=";text-align:right;direction:rtl"><i class="icon-tags"></i> الوطن / نهاية / أعلى / أسفل / يسار / يمين لتحديد الملف </p>
<p style=";text-align:right;direction:rtl"><i class="icon-tags"></i> لرد ضغط تحقق للضغط على الحرف الأول من الملفات الشخصية والمجلدات المحددة دورة التلقائي </p>
</div>
+804
View File
@@ -0,0 +1,804 @@
<?php
return array(
"path_api_select_file" => "يرجى اختيار ملف ...",
"path_api_select_folder" => "الرجاء تحديد مجلد ...",
"path_api_select_image" => "يرجى اختيار صورة ...",
"share_can_upload" => "السماح بالتحميل",
"move_error" => "فشل نقل",
"setting_basic" => "الإعدادات الأساسية",
"setting_user_sound_open" => "فتح الصوت",
"setting_user_animate_open" => "فتح الرسوم المتحركة",
"recycle_open_if" => "فتح سلة المحذوفات",
"recycle_open" => "فتح",
"setting_user_recycle_desc" => "بعد حذف سيتم حذف الحذف المادي مباشرة",
"setting_user_animate_desc" => "نافذة مفتوحة والرسوم المتحركة الأخرى",
"setting_user_sound_desc" => "تشغيل الصوت",
"setting_user_imageThumb" => "الصور المصغرة",
"setting_user_imageThumb_desc" => "تجربة تصفح أفضل بعد الفتح",
"setting_user_fileSelect" => "فتح الاختيار رمز الملف",
"setting_user_fileSelect_desc" => "رمز الملف الاختيار مفتاح اليسار، انقر بزر الماوس الأيمن فوق القائمة اختصار الإدخال",
"qrcode" => "URL رمز الاستجابة السريعة",
"theme_mac" => "ماك الأبيض الحد الأدنى",
"theme_win7" => "Windows 7",
"theme_win10" => "Windows 10",
"theme_metro" => "المترو الأزرق كلاسيك",
"theme_metro_green" => "مترو الضوء الأخضر",
"theme_metro_purple" => "مترو أنيقة الأرجواني",
"theme_metro_pink" => "مترو روز",
"theme_metro_orange" => "مترو برتقالية زاهية",
"theme_alpha_image" => "مشرق - الطيران",
"theme_alpha_image_sun" => "مشرق - الغروب",
"theme_alpha_image_sky" => "سمفونية - السماء الزرقاء",
"theme_diy" => "<b>مخصص</b>",
"theme_diy_title" => "إعدادات مخصصة لقضاء وقت الفراغ",
"theme_diy_background" => "خلفية",
"theme_diy_image" => "صور",
"theme_diy_color_blur" => "التدرج اللوني",
"theme_diy_image_blur" => "الصورة ضبابية",
"theme_diy_image_url" => "عنوان صور",
"theme_diy_color_start" => "اللون ابتداء من",
"theme_diy_color_end" => "نهاية اللون",
"theme_diy_color_radius" => "زاوية الانحدار",
"system_role_admin_set" => "الإداريين من جميع الحقوق، دون أن يحدد!",
"login_error_user_not_use" => "تم تعطيل المستخدم! الرجاء الاتصال بمسؤول",
"login_error_kod_version" => "الصراع نسخة",
"login_error_role" => "لا وجود مجموعة عرض أذونات، يرجى الاتصال بمسؤول",
"no_permission_group" => "أنت لست في هذه المجموعة!",
"no_permission_write" => "الدليل لايوجد إذن الكتابة",
"user" => "المستخدم",
"save_as" => "حفظ ك",
"check_update" => "تحديث",
"keyboard_type" => "وضع لوحة المفاتيح",
"font_family" => "الخطوط",
"code_mode" => "تسليط الضوء على تركيب",
"path_can_not_share" => "يدعم فقط مشاركة المستندات الخاصة بك!",
"path_can_not_action" => "هذا الدليل لا يدعم هذه العملية!",
"wap_page_pc" => "نسخة الكمبيوتر",
"wap_page_phone" => "متحرك",
"image_size" => "أبعاد الصورة",
"no_permission_action" => "لم يكن لديك هذا الإذن، يرجى الاتصال بمسؤول!",
"path_is_root_tips" => "قد حان إلى الدليل الجذر!",
"kod_group" => "منظمة",
"my_kod_group" => "أنا في القسم",
"space_tips_default" => "(GB) 0 لا حدود",
"space_tips_full" => "دون الحد",
"space_size" => "الفضاء",
"space_size_use" => "استخدام الفضاء",
"space_is_full" => "لا توجد مساحة كافية متبقية ، يرجى الاتصال بالمسؤول!",
"system_open_true_path" => "افتتح بنجاح في إدارة ملف!",
"group_role_error" => "خطأ أذونات دور (أي إعدادات إذن)",
"group_role_error_admin" => "أذونات غير كافية",
"markdown_content" => "جدول المحتويات",
"system_group" => "المستخدمين والإدارات",
"system_group_edit" => "إدارة القسم",
"system_group_role" => "هوية دور",
"system_group_create" => "إدارة جديدة",
"system_group_name" => "اسم القسم",
"system_group_father" => "الإدارة العليا",
"system_group_add" => "إضافة إدارة فرعية",
"system_group_remove" => "إزالة القسم",
"system_group_remove_tips" => "هل تريد بالتأكيد حذف القسم؟<br/>بعد حذف جزء من المستخدم سيتم إزالة، انتقل القطاع الفرعي إلى قطاع الجذر",
"system_group_select" => "اختر قسم",
"system_group_select_result" => "سوف الأعضاء تنتمي إلى القطاعات التالية",
"system_role_admin_tips" => "ملاحظات: غير مصرح لمسؤولي النظام للتحكم",
"system_member_action" => "إدارة المستخدم",
"system_member_add" => "العضو الجديد",
"system_member_role" => "أدوار إذن",
"system_member_role_select" => "اختر",
"system_member_password_tips" => "لا تملأ لا تعديل",
"system_set_home_path" => "كتالوج مخصص",
"system_set_home_path_tips" => "الدليل الافتراضي فارغ",
"system_member_group" => "حيث الإدارة",
"system_member_group_edit" => "قسم التحرير",
"system_member_remove" => "حذف العضو",
"system_member_remove_tips" => "تأكيد المستخدم حذف؟<br/>بعد إزالة دليل المستخدم سوف تمحى تماما",
"system_member_set_role" => "لتأكيد التغيير من الأذونات مجموعة مختارة من المستخدمين؟",
"system_member_remove_group" => "تحديد ستتم إزالة المستخدم المحدد من هذه المجموعة؟",
"system_member_import" => "إضافة السائبة",
"system_member_import_desc" => "مستخدم واحد في كل سطر،<br/>بالفعل موجودة يتم تجاهل بصمت",
"system_member_use" => "تمكين",
"system_member_unuse" => "تعطيل",
"system_member_space" => "تعيين حجم مساحة المستخدم ",
"system_member_space_tips" => " تعيين حجم مساحة المستخدم ",
"system_member_space_number" => " يجب ان يكون رقم!",
"system_member_group_config" => "دفعة إدارة الإعداد",
"system_member_group_remove" => "تمت إزالتها من القسم",
"system_member_group_insert" => "أضف إلى القسم",
"system_member_group_reset" => "إعادة تعيين القسم",
"system_member_group_error" => "خطأ في الإدارة",
"system_group_action" => "إدارة القسم",
"system_role_add" => "إضافة الهوية دور",
"system_role_read" => "قراءة فقط",
"system_role_write" => "يمكن القراءة والكتابة",
"system_setting_root_path" => "وصول الجذر",
"system_setting_root_path_desc" => "مسؤول النظام فقط يمكن الوصول إلى كافة الدلائل، يمكن للجماعات حقوقية أخرى من المستخدمين ترى سوى دليل المستخدم الخاص بهم. إذا كنت ترغب في تشغيل أو إيقاف وصول المسؤول<br/>إلى الدلائل الأخرى، يمكنك تعديل فب open_basedir المعلمات مكافحة المواقع المشتركة،<a href=\"https://www.google.com.hk/search?&q=php+open_basedir\" target=\"_lank\">وضع</a>",
"system_group_role_title" => "إدارة دور إدارة السلطة",
"system_group_role_remove" => "انقر فوق موافق لحذف دور القسم",
"system_group_role_style" => "أسلوب",
"system_group_role_display" => "سواء",
"system_group_role_display_desc" => "تعيين ما إذا كان سيتم عرض حقوق المستخدم قسم أم لا",
"role_type_name_read" => "قرأ",
"role_type_name_read:list" => "قائمة ملف",
"role_type_name_read:info" => "ملف (مجلد) خاصية عرض، بحث مجلد",
"role_type_name_read:copy" => "نسخ ملف",
"role_type_name_read:preview" => "معاينة الصورة (الصور والوثائق والفيديو والصوت)",
"role_type_name_read:download" => "ملف (مجلد) تحميل",
"role_type_name_write" => "إرسال",
"role_type_name_write:add" => "إنشاء ملف (مجلد)، استخراج ملف مضغوط",
"role_type_name_write:edit" => "حفظ الملف إلى تعديل",
"role_type_name_write:change" => "إعادة تسمية، وضبط بنية الدليل",
"role_type_name_write:upload" => "ملف (مجلد) تحميل وتنزيل عن بعد",
"role_type_name_write:remove" => "ملف (مجلد) حذف، وقطع",
"group_guest" => "آخر",
"group_guest_desc" => "أنت لست عضوا في القسم،<br/>يمكن الوصول فقط إلى [قسم المشتركة الدليل] المحتوى التالي، أذونات للقراءة فقط.",
"group_role_lebel_desc" => "أنت عضو في هذا القسم،<br/>جميع الوثائق داخل القسم جميع الحقوق محفوظة من قبل المشرف",
"button_save_and_add" => "حفظ والاستمرار في إضافة",
"path_cannot_search" => "الدليل لا يدعم البحث!",
"not_support" => "غير معتمدة!",
"group_not_exist" => "مجموعة العضو غير موجود!",
"upload_clear_all" => "مسح جميع",
"upload_clear" => "واضح المنجزة",
"upload_setting" => "نصب",
"upload_tips" => "يستخدم تحميل شريحة، لم تعد تخضع لحدود PHP.INI، وأوصت سحب مجلد الكروم وتجربة تحميل قطرة",
"upload_exist" => "ملف بنفس الاسم",
"upload_exist_rename" => "إعادة تسمية",
"upload_exist_replace" => "غطاء",
"upload_exist_skip" => "تخطى",
"upload_add_more" => "إضافة السائبة",
"more" => "أكثر",
"system_setting" => "إعدادات النظام",
"openProject" => "فتح محرر المشروع",
"url_download" => "تحميل",
"url_link" => "URL",
"app_type_link" => "الاختصارات",
"createLink" => "إنشاء اختصار",
"createLinkHome" => "إرسالها إلى اختصار سطح المكتب",
"createProject" => "إضافة إلى مشروع محرر",
"only_read" => "قراءة فقط",
"only_read_desc" => "الدليل لايوجد إذن الكتابة<br/>يمكنك تعيين الأذونات لهذا الدليل على الملقم",
"not_read" => "غير قابل للقراءة",
"explorerNew" => "رابط KOD",
"zip_download_ready" => "بعد ضغط تلقائيا التحميل، يرجى الانتظار ...",
"set_background" => "تعيين كخلفية سطح المكتب",
"share" => "سهم",
"my_share" => "نصيبي",
"group_share" => "مشاركة المجموعة الخارجية",
"share_edit" => "تعديل المشاركة",
"share_remove" => "إلغاء المشاركة",
"share_remove_tips" => "هل تريد بالتأكيد إلغاء المشاركة؟ سيتم إبطال الاتصال العام.",
"share_path" => "مشاركة المسار",
"share_title" => "تقاسم الموارد",
"share_name" => "مشاركة العنوان",
"share_time" => "انتهاء",
"share_time_desc" => "لم يتم تعيين لاغية",
"share_password" => "كلمة استخراج",
"share_password_desc" => "لم يتم تعيين كلمة المرور فارغة",
"share_cancle" => "إلغاء مشاركة",
"share_create" => "إنشاء ارتباط العام",
"share_url" => "عنوان المشتركة",
"share_not_download" => "حظر حمل",
"share_not_download_tips" => "حظر المشارك تحميل!",
"share_code_read" => "قارئ رمز",
"share_save" => "حفظ التكوين",
"share_error_param" => "خطأ المعلمة!",
"share_error_user" => "العضو خطأ المعلومات!",
"share_error_sid" => "حصة لا وجود له!",
"share_error_time" => "جئت في وقت متأخر جدا، انتهت صلاحية حصة!",
"share_error_path" => "ملف مشترك لا وجود لها، يتم حذفه أو إزالته!",
"share_error_password" => "كلمة مرور خاطئة!",
"share_error_show_tips" => "هذا النوع لا يدعم معاينة الملف!",
"share_view_num" => "المشاهدات:",
"share_download_num" => "التنزيلات:",
"share_open_page" => "فتح صفحة مشتركة",
"open_the_path" => "أدخل الدليل",
"recycle_clear" => "تفريغ سلة المهملات",
"recycle_clear_success" => "إفراغ سلة المهملات النجاح!",
"recycle_clear_info" => "هل أنت متأكد أنك تريد فارغة تماما سلة المهملات؟",
"fav_remove" => "إلغاء مجموعة",
"remove_item" => "البنود",
"uploading" => "تحميل",
"upload_tips_more" => "العديد من الملفات، على توصية تحميل مضغوط، ثم بفك على الانترنت!",
"uploading_move" => "في نقل الدمج ...",
"show_file" => "معاينة صفحة جديدة",
"unknow_file_title" => "فتح ملف تلميح!",
"unknow_file_tips" => "لم تدعم تطبيق هذا الملف، يمكنك:",
"unknow_file_try" => "محاولة",
"unknow_file_download" => "تحميل الملف",
"unknow_plugin_search" => "البحث ذات الصلة التطبيقات المثبتة",
"config_save_error_auth" => "فشل في حفظ التكوين، حظرت الإدارة هذا الامتياز!",
"config_save_error_file" => "خطأ، ملف قابل للكتابة!",
"beautify_code" => "كود المنسق",
"convert_case" => "تحويل القضية",
"convert_upper_case" => "تحويلها إلى أحرف كبيرة",
"convert_lower_case" => "تحويلها إلى أحرف صغيرة",
"editor_insert_time" => "الوقت الحالي ",
"editor_md5" => " تشفير Md5 ",
"editor_qrcode" => " سلسلة رمز ثنائي الأبعاد ",
"editor_regx" => " اختبار التعبير العادي ",
"editor_chinese" => " تحويل مبسط ",
"editor_chinese_simple" => " تحويل إلى الصينية المبسطة ",
"editor_chinese_traditional" => " تحويل إلى الصينية التقليدية ",
"editor_base64" => "Base64 الترميز ",
"editor_base64_encode" => " ترميز Base64 ",
"editor_base64_decode" => " فك Base64 ",
"editor_url" => " برنامج ترميز URL ",
"editor_url_encode" => " ترميز URL ",
"editor_url_decode" => " فك تشفير عنوان URL ",
"editor_unicode" => " برنامج ترميز يونيكود ",
"editor_unicode_encode" => " ترميز يونيكود ",
"editor_unicode_decode" => " فك Unicode",
"editor_tools_select_tips" => " يرجى تحديد المحتوى الذي تريد تحويله!",
"editor_calc" => "آلة حاسبة مجانية",
"shortcut" => "الاختصارات",
"use_free" => "الاستمرار في استخدام نسخة مجانية",
"learn_more" => "تعرف على المزيد",
"replace" => "استبدل",
"selectAll" => "اختر",
"reload" => "تحديث",
"about" => "في",
"complete_current" => "الإكمال التلقائي للتيار",
"view" => "رأي",
"tools" => "أداة",
"help" => "مساعدة",
"not_exists" => "غير موجود",
"group_role_fileDownload" => "التنزيلات",
"group_role_share" => "سهم",
"users_share" => "مشاركة",
"system_setting_save" => "إعدادات الأمان",
"system_setting_menu" => "إدارة القائمة",
"system_name" => "اسم البرنامج",
"system_name_desc" => "عنوان شعار البرنامج",
"system_desc" => "وصف البرنامج",
"path_hidden" => "الاستثناءات دليل",
"version_not_support" => "الإصدار الخاص بك لا يدعم هذا، يرجى الدخول إلى الموقع الرسمي لشراء نسخة مطورة!",
"version_not_support_number" => "ولما كان عدد من التقييد لا يدعم هذه العملية، يرجى شراء نسخة مطورة من الموقع الرسمي!",
"path_hidden_desc" => "الدلائل والملفات افتراضيا لا يتم عرض، مفصولة بفواصل",
"new_user_folder" => "يتم إنشاء مستخدم جديد الدليل الافتراضي",
"new_user_folder_desc" => "مفصولة بفواصل",
"new_user_app" => "يتم إنشاء مستخدم جديد التطبيق الافتراضي",
"new_user_app_desc" => "تطبيقات مركز التطبيق، تعددية مفصولة بفواصل",
"auto_login" => "آخر تسجيل الدخول التلقائي",
"auto_login_desc" => "تسجيل الدخول الافتراضي المستخدم<code>guest/guest</code>المستخدمين، وبعد الافتتاح لضمان وجود المستخدم",
"first_in" => "بعد تسجيل الدخول إلى الافتراضي",
"version_price_free" => "حر",
"version_name_1" => "VIP 1",
"version_name_2" => "VIP 2",
"version_name_3" => "VIP 3",
"version_name_4" => "VIP 4",
"version_name_5" => "VIP 5",
"version_name_6" => "VIP 6",
"version_vip_free" => "Free",
"version_vip_1" => "VIP 1",
"version_vip_2" => "VIP 2",
"version_vip_3" => "VIP 3",
"version_vip_4" => "VIP 4",
"version_vip_5" => "VIP 5",
"version_vip_6" => "VIP 6",
"path_can_not_write_data" => "الدليل غير قابل للكتابة، تعيين الدليل وكافة الدلائل إلى محاولة مرة أخرى بعد قراءة والكتابة!",
"menu_name" => "اسم القائمة",
"menu_hidden" => "إخفاء",
"menu_show" => "عرض",
"menu_move_down" => "إلى",
"menu_move_up" => "فوق",
"menu_move_del" => "حذف",
"menu_open_window" => "فتح نافذة جديدة",
"menu_sub_menu" => "القائمة الفرعية",
"url_path" => "الموقع الالكترونى",
"url_path_desc" => "الموقع الالكترونى أو رمز شبيبة",
"no_permission_read" => "لم يكن لديك إذن لقراءة!",
"no_permission_download" => "لم يكن لديك إذن لتحميل!",
"php_env_check" => "تعمل مراقبة البيئة:",
"php_env_error" => "مكتبة فب مفقودة",
"php_env_error_ignore" => "تجاهل وأدخل",
"php_env_error_version" => "PHP النسخة لا يمكن أن يكون أقل من 5.0",
"php_env_error_path" => "غير قابل للكتابة",
"php_env_error_list_dir" => "خادم الويب الخاص بك يفتح الدليل ميزة قائمة لأسباب أمنية، تعطيل هذه الميزة!<a href=\"https://www.google.com.hk/#newwindow=1&safe=strict&q=web+server+turn+off+directory+listing\" target=\"blank\">كيف؟</a>",
"php_env_error_gd" => "وينبغي أن تكون مكتبة GD بى مفتوحة، وإلا رمز، استخدم الصورة المصغرة لن تعمل بشكل صحيح",
"install_login" => "يمكنك استخدام تسجيل الدخول حساب التالية",
"install_enter" => "النظام",
"install_user_default" => "المسؤول: {0} / (دون تعيين كلمة مرور)<br/>مستخدم العادي: {1}<br/>مستخدم ضيف: {2}",
"login_root_password" => "تعيين كلمة مرور المسؤول",
"login_root_password_repeat" => "تأكيد كلمة المرور مرة أخرى",
"login_root_password_equal" => "كلمات السر اثنين لا تتطابق!",
"login_root_password_tips" => "تعيين كلمة مرور المسؤول!",
"forget_password" => "نسيت كلمة المرور",
"forget_password_tips" => "نسيت كلمة مرور المسؤول: <br/> الرجاء تسجيل الخادم حذف <b>./data/system/install.lock</b> إعادة تعيين. <br/><br/> غير مسؤول نسيت كلمة المرور: <br/> الرجاء الاتصال بمسؤول لإعادة تعيين!",
"copyright_desc" => "Kodexplorer هو نظام إدارة الوثائق على شبكة الإنترنت نالت استحسانا كبيرا، ويمكن استخدامه لإدارة وثيقة داخلية أو مشتركة، ويمكن أيضا أن تستخدم على خادم إدارة المواقع استبدال بروتوكول نقل الملفات، وحتى webIDE تطوير الإنترنت مباشرة. يمكنك أيضا برمجة التطور الثاني لدمج هذا في النظم الموجودة لديك.",
"copyright_contact" => "Contact us:kodcloud@qq.com <a>.</a> <a href=\"javascript:core.openWindow('http://bbs.kodcloud.com/');\">Feedback</a>",
"copyright_info" => "Copyright © <a href=\"https://kodcloud.com/?kodref=%s\" target=\"_blank\">kodcloud.com</a>.",
"copyright_pre" => "Powered by KodExplorer",
"kod_name" => "KodExplorer",
"kod_name_desc" => "المانجو سحابة • مستكشف",
"kod_power_by" => " - Powered by KodExplorer",
"kod_name_copyright" => "المانجو سحابة • مستكشف",
"kod_meta_name" => "KodExplorer",
"kod_meta_keywords" => "KodExplorer، KOD، kodCloud، ويب أو إس، webIDE، فب filemanage، filemanage، داو سحابة، سحابة المانجو، وأنظمة إدارة الوثائق، والقرص السحابية المشاريع، المستكشف ،، وثائق على شبكة الإنترنت، مكتب على الانترنت، المكتب على الانترنت، على الانترنت CAD المعاينة، والتحرير على الانترنت ، محرر على الانترنت",
"kod_meta_description" => "KodExplorer يمكن أن تلقي بظلالها الطريق (المانجو سابقا سحابة) هي الشركة الرائدة في مجال الحكومة / الغيوم الشركات الخاصة على الانترنت ونظام إدارة الوثائق عن المواقع الشخصية، نشر السحابية المشاريع الخاصة، وشبكة التخزين، وإدارة الوثائق على الانترنت، والمكتب على الانترنت لتوفير آمنة وخاضعة للرقابة، بسيطة وسهلة استخدام، وتطويعه للغاية المنتجات السحابية الخاصة. باستخدام ويندوز واجهة أسلوب وممارسات التشغيل، دون الحاجة إلى التكيف مع البدء بسرعة، ودعم المئات من تنسيق ملف المعاينة على الانترنت شعبية، وعرض وتحرير وقوية صديقة للبيئة، هو محاكمة مرة واحدة، لم يعد جزء لا يتجزأ من القطاع الخاص عروض السحابية.",
"kod_meta_copyright" => "kodcloud.com",
"login" => "تسجيل الدخول",
"guest_login" => "تسجيل يهمنا",
"username" => "تسجيل الدخول",
"userNickName" => "لقب المستخدم",
"password" => "كلمة المرور",
"login_code" => "رموز",
"need_check_code" => "رمز التوثيق الدخول المفتوح",
"need_check_code_desc" => "بعد تسجيل الدخول ، يجب عليك إدخال رمز التحقق.",
"setting_csrf_protect" => "حماية CSRF المفتوحة",
"setting_csrf_protect_desc" => "بعد نوع افتتاح هجوم يمكن أن تحمي بشكل فعال CSRF",
"login_rember_password" => "تذكر كلمة المرور",
"setting_show_root_group" => "قائمة بجميع الإدارات",
"setting_show_root_group_desc" => "قسم شجرة الجذر دليل ما إذا كان سيتم سرد جميع الإدارات",
"setting_show_share_user" => "قائمة جميع المستخدمين",
"setting_show_share_user_desc" => "يتم سرد قسم الجذر دليل شجرة لجميع مشاركة المستخدم",
"setting_clear_user_recycle" => "إفراغ سلة المحذوفات لجميع المستخدمين",
"setting_clear_cache" => "إفراغ ذاكرة التخزين المؤقت",
"setting_icp" => "حقوق الطبع والنشر أو سجل رقم",
"setting_global_css" => "المغلق العالمي مخصص",
"setting_global_css_desc" => "وكل الصفحات إدراج المغلق مخصص",
"setting_global_html" => "إحصائية HTML كود",
"setting_global_html_desc" => "سيتم إدراج جميع صفحات هذا أتش تي أم أل كود الفقرة، رمز يمكن وضعها إحصاءات طرف ثالث",
"us" => "kodcloud.com",
"login_not_null" => "اسم المستخدم وكلمة المرور لا يمكن أن يكون فارغا!",
"code_error" => "رموز الخطأ",
"password_error" => "اسم المستخدم أو كلمة المرور غير صحيحة!",
"password_not_null" => "كلمة السر لا يمكن أن يكون فارغا!",
"old_password_error" => "القديمة كلمة السر غير صحيحة!",
"permission" => "إذن!",
"permission_edit" => "تعديل ضوابط",
"file_info_owner" => "مالك",
"file_info_group" => "مجموعة",
"no_permission" => "عطل المشرف هذا الامتياز!",
"no_permission_ext" => "المسؤول حظر هذا النوع من أذونات الملف",
"dialog_max" => "تعظيم",
"dialog_min" => "خفض",
"dialog_min_all" => "تصغير كافة",
"dialog_display_all" => "عرض كل النوافذ",
"dialog_close_all" => "إغلاق جميع",
"open" => "فتح",
"others" => "آخر",
"open_with" => "فتح ل ...",
"close" => "قريب",
"close_all" => "إغلاق جميع",
"close_left" => "إغلاق علامة التبويب اليسار",
"close_right" => "إغلاق علامات التبويب إلى اليمين",
"close_others" => "وثيقة أخرى",
"loading" => "عملية ...",
"warning" => "تحذير",
"getting" => "الحصول على ...",
"sending" => "نقل البيانات ...",
"data_error" => "خطأ البيانات!",
"get_success" => "الحصول على النجاح!",
"save_success" => "حفظ بنجاح!",
"success" => "عملية ناجحة",
"error" => "فشلت العملية",
"error_repeat" => "العملية الفاشلة، والاسم موجود بالفعل!",
"word_error" => "فشل ",
"word_success" => " نجاح",
"system_error" => "خطأ في النظام",
"name" => "اسم",
"type" => "نوع",
"contain" => "احتواء",
"address" => "موقع",
"size" => "حجم",
"byte" => "بايت",
"path" => "مسار",
"action" => "التشغيل",
"create_time" => "خلق",
"modify_time" => "تعديل",
"last_time" => "آخر زيارة",
"sort_type" => "الترتيب حسب",
"time_type" => "Y/m/d H:i:s",
"time_type_info" => "Y/m/d H:i:s",
"public_path" => "الدليل العام",
"system_path_not_change" => "دليل النظام، لا يمكن تعديلها",
"file" => "ملف",
"folder" => "ملف",
"copy" => "نسخة",
"past" => "عصا",
"clone" => "إنشاء نسخة",
"cute" => "جز",
"cute_to" => "الانتقال إلى ...",
"copy_to" => "نسخة ...",
"remove" => "حذف",
"remove_force" => "إزالة",
"info" => "ممتلكات",
"list_type" => "رأي",
"list_icon" => "رمز مجموعة",
"list_list" => "ترتيب قائمة",
"list_list_split" => "وضع العمود",
"sort_up" => "زيادة",
"sort_down" => "تقليل",
"order_type" => "الترتيب حسب",
"order_desc" => "تنازلي",
"order_asc" => "تصاعدي",
"rename" => "إعادة تسمية",
"add_to_fav" => "أضف إلى المفضلة",
"search_in_path" => "البحث في المجلد",
"add_to_play" => "إضافة إلى قائمة تشغيل",
"manage_fav" => "إدارة المفضلة",
"refresh_tree" => "شجرة الدليل على تحديث",
"manage_folder" => "إدارة الدليل",
"close_menu" => "إغلاق القائمة",
"zip" => "إنشاء حزمة مضغوط",
"unzip" => "لاستخراج ...",
"unzip_folder" => "فك الضغط إلى مجلد",
"unzip_this" => "استخراج للتيار",
"unzip_to" => "لاستخراج ...",
"zipview_file_big" => "الملف كبير جدا، ومن ثم استخراج عملية المعاينة!",
"clipboard" => "عرض الحافظة",
"clipboard_clear" => "الحافظة فارغة",
"full_screen" => "شاشة كاملة",
"folder_info_item" => "البنود",
"folder_info_item_select" => "واختيار",
"file_load_all" => "انقر نقرا مزدوجا فوق لتحميل جميع ......",
"tips" => "موجه",
"ziping" => "فتح سوستة ...",
"unziping" => "استخراج ...",
"moving" => "تشغيل خدمات الهاتف النقال ...",
"remove_title" => "تأكيد حذف",
"remove_info" => "تأكيد لحذف العنصر المحدد؟",
"remove_title_force" => "حذفه نهائيا",
"remove_info_force" => "أنت متأكد أنك تريد حذف هذه الوثيقة بشكل دائم؟",
"name_isexists" => "خطأ، والاسم موجود بالفعل!",
"install" => "تثبيت",
"width" => "عرض",
"height" => "ارتفاع",
"app" => "تطبيقات الخفيفة",
"app_store" => "تطبيقات الخفيفة",
"app_create" => "إنشاء تطبيق",
"app_edit" => "تعديل التطبيق",
"app_group_all" => "كامل",
"app_group_game" => "لعبة",
"app_group_tools" => "أداة",
"app_group_reader" => "قرأ",
"app_group_movie" => "تلفزيون",
"app_group_music" => "موسيقى",
"app_group_life" => "حياة",
"app_group_others" => "آخر",
"app_desc" => "وصف",
"app_icon" => "تطبيقات رمز",
"app_icon_show" => "عنوان الموقع أو الدليل",
"app_group" => "حزم التطبيق",
"app_type" => "نوع",
"app_type_url" => "صلة",
"app_type_code" => "تمديد شبيبة",
"app_display" => "الخارج",
"app_display_border" => "بلا حدود (أي تحديد بلا حدود)",
"app_display_size" => "تغيير حجم (راجع للتعديل)",
"app_size" => "حجم",
"app_url" => "عنوان الرابط",
"app_code" => "كود شبيبة",
"edit" => "تحرير",
"edit_can_not" => "لا ملف نصي",
"edit_too_big" => "الملف كبير جدا، لا يمكن أن يكون أكبر من 40M",
"open_default" => "افتراضي المفتوحة",
"open_ie" => "فتح المتصفح",
"refresh" => "تحديث",
"refresh_all" => "فرض تحديث",
"newfile" => "ملف جديد",
"newfile_save_as" => "حفظ ل",
"newfolder" => "مجلد جديد",
"newothers" => "جديد أخرى",
"path_loading" => "تحميل ...",
"go" => "المشي!",
"go_up" => "الطبقة العليا",
"history_next" => "إلى الأمام",
"history_back" => "تراجع",
"address_in_edit" => "اضغط للدخول في وضع التحرير",
"double_click_rename" => "انقر نقرا مزدوجا فوق إعادة تسمية",
"double_click_open" => "انقر نقرا مزدوجا لفتح",
"path_null" => "مجلد فارغ!",
"file_size_title" => "رمز الحجم",
"file_size_small_super" => "الصغيرة جدا",
"file_size_small" => "أيقونات صغيرة",
"file_size_default" => "الرموز",
"file_size_big" => "رموز كبيرة",
"file_size_big_super" => "دلالات كبيرة",
"upload" => "تحميل",
"upload_ready" => "انتظار للتحميل",
"upload_success" => "تحميل ناجحة",
"upload_path_current" => "التبديل إلى الدليل الحالي",
"upload_select" => "حدد ملف",
"upload_max_size" => "الحد الأقصى المسموح به",
"upload_size_info" => "إذا كنت ترغب في تكوين المزيد، يرجى تعديل الحد الأقصى المسموح PHP.INI تحميل. عند تحديد ملف أكبر من هذا التكوين يتم تصفيتها تلقائيا.",
"upload_error" => "فشل تحميل",
"upload_error_http" => "شبكة أو جدار حماية أخطاء",
"upload_muti" => "تحميل متعددة ملف",
"upload_drag" => "سحب وإسقاط تحميل",
"upload_drag_tips" => "تخفيف لتحميل!",
"path_not_allow" => "اسم الملف غير مسموح",
"download" => "تحميل",
"downloading" => "تحميل ...",
"download_address" => "تحميل",
"download_ready" => "سيتم تحميل",
"download_success" => "تحميل النجاح!",
"download_error" => "تحميل فشل!",
"download_error_create" => "خطأ الكتابة!",
"download_error_exists" => "رابط إلى ملف فشل!",
"upload_error_null" => "أي ملف!",
"upload_error_big" => "يتجاوز حجم الملف حدود الخادم",
"upload_error_move" => "فشل نقل الملف!",
"upload_error_exists" => "الملف موجود مسبقا",
"upload_local" => "تحميل المحلي",
"download_from_server" => "بعد تحميل",
"save_path" => "حفظ مسار",
"upload_select_muti" => "إن تعددية تحميل ملف اختيار",
"search" => "بحث",
"searching" => "البحث ...",
"search_result" => "نتائج البحث",
"seach_result_too_more" => "نتائج البحث كثيرة جدا، فمن المستحسن لدليل أو الكلمات",
"search_null" => "لا النتائج!",
"search_uplow" => "حالة الأحرف",
"search_content" => "محتويات ملف البحث",
"search_info" => "الرجاء إدخال مصطلح البحث ومسارات البحث!",
"search_ext_tips" => "بواسطة | فصلها، على سبيل المثال فب | شبيبة | المغلق<br/>لا تملأ بحث ملف النص الافتراضي",
"file_type" => "نوع الملف",
"goto" => "انتقال إلى",
"server_dwonload_desc" => "تم إضافة مهمة إلى قائمة التحميل",
"parent_permission" => "أذونات الدليل الأم",
"root_path" => "المستندات",
"lib" => "مخزن",
"fav" => "المرجعية",
"desktop" => "سطح المكتب",
"browser" => "المتصفح",
"my_computer" => "جهاز الكمبيوتر الخاص بي",
"recycle" => "قمامة",
"my_document" => "المستندات",
"my_picture" => "صوري",
"my_music" => "الموسيقى",
"my_movie" => "بلدي فيديو",
"my_download" => "بلدي التنزيلات",
"ui_desktop" => "سطح المكتب",
"ui_explorer" => "إدارة ملف",
"ui_editor" => "محرر",
"adminer" => "adminer",
"ui_project_home" => "مشروع الرئيسية",
"ui_login" => "تسجيل الدخول",
"ui_logout" => "استقال",
"setting" => "إعدادات النظام",
"setting_title" => "خيارات",
"setting_user" => "مركز الشخصية",
"setting_password" => "تغيير كلمة المرور",
"setting_password_old" => "كلمة السر القديمة",
"setting_password_new" => "المنقحة ل",
"setting_language" => "إعدادات اللغة",
"setting_member" => "إدارة المستخدم",
"setting_group" => "إدارة مجموعة المستخدم",
"setting_group_add" => "إضافة مجموعة العضو",
"setting_group_edit" => "تحرير المجموعات العضو",
"setting_theme" => "إعدادات موضوع",
"setting_wall" => "إعدادات خلفية",
"setting_wall_desktop" => "خلفية سطح المكتب",
"setting_wall_desktop_list" => "إدارة خلفية سطح المكتب",
"setting_wall_login_list" => "تسجيل الدخول إدارة خلفيات",
"setting_wall_login_tips" => "نصيحة: عندما يكون هناك أكثر من قطعة واحدة ، سيتم تدوير خلفية واجهة تسجيل الدخول بشكل عشوائي",
"setting_wall_diy" => "خلفية مخصصة:",
"setting_wall_info" => "الصورة عنوان URL، يمكن أن الصور المحلية يكون الحق في الحصول على المتصفح لفتح صورة",
"setting_fav" => "مدير المرجعية",
"setting_help" => "استخدام التعليمات",
"setting_about" => "حول أعمال",
"setting_success" => "وقد اتخذت تعديل أثر!",
"can_not_repeat" => "لا يسمح للتكرار",
"absolute_path" => "عنوان مطلق",
"group" => "مجموعات المستخدمين",
"data_not_full" => "قدمت بيانات غير مكتملة!",
"default_user_can_not_do" => "لا يمكن للمستخدم الافتراضي تعمل",
"default_group_can_not_do" => "لا يمكن للمجموعات المستخدم الافتراضية تعمل",
"username_can_not_null" => "اسم المستخدم لا يمكن أن تكون فارغة!",
"groupname_can_not_null" => "اسم مجموعة المستخدم لا يمكن أن تكون فارغة!",
"groupdesc_can_not_null" => "مجموعة مستخدمي الوصف لا يمكن أن يكون فارغا!",
"group_move_user_error" => "تحرك فشل مستخدمين مجموعة مستخدمي",
"group_already_remove" => "تم حذف مجموعة المستخدم",
"group_not_exists" => "عدم وجود هذا الفريق المستعمل",
"member_add" => "إضافة مستخدم",
"password_null_not_update" => "وقالوا انهم لم يتغير لا شغل في كلمة السر",
"if_save_file_tips" => "لا يتم حفظ بعض الملفات ، هل أنت متأكد من إغلاق النافذة؟",
"if_save_file" => "لم يتم حفظ الملف، تريد حفظ؟",
"if_remove" => "تأكيد حذف",
"member_remove_tips" => "بعد إزالة دليل المستخدم سيتم مسح",
"group_remove_tips" => "بعد إزالة مجموعة المستخدم من المستخدمين لا يمكن تسجيل الدخول<br/>(تحتاج إلى إعادة تعيين مجموعة المستخدم)",
"group_name" => "اسم مجموعة المستخدم",
"group_name_tips" => "توصية الاسم باللغة الانكليزية، لا يمكن تكرارها",
"group_desc" => "اسم العرض",
"group_desc_tips" => "اسم المجموعة الوصف",
"group_role_ext" => "القيود تمديد",
"group_role_ext_tips" => "مع متعددة | فصل",
"group_role_file" => "إدارة ملف",
"group_role_upload" => "السماح بالتحميل",
"group_role_user" => "بيانات المستخدم",
"group_role_group" => "إدارة مجموعة المستخدم",
"group_role_member" => "إدارة المستخدم",
"group_role_mkfile" => "ملف جديد",
"group_role_mkdir" => "مجلد جديد",
"group_role_pathrname" => "إعادة تسمية",
"group_role_pathdelete" => "حذف ملف",
"group_role_pathinfo" => "خصائص ملف",
"group_role_pathmove" => "الخطوة (نسخ / قص / لصق / جر العملية)",
"group_role_zip" => "ضغط",
"group_role_unzip" => "بفك",
"group_role_search" => "بحث",
"group_role_filesave" => "حفظ الملف إلى تعديل",
"group_role_can_upload" => "تحميل وتنزيل",
"group_role_download" => "بعد تحميل",
"group_role_passowrd" => "تغيير كلمة المرور",
"group_role_config" => "بيانات التكوين",
"group_role_fav" => "عمليات المرجعية (إضافة / تحرير / حذف)",
"action_list" => "عرض قائمة",
"action_add" => "إضافة",
"action_edit" => "تحرير",
"action_del" => "حذف",
"group_role_ext_warning" => "تحميل لا تسمح بمثل هذه الملفات،<br/>إعادة تسمية (التي أعيدت تسميتها لتمديد معين)،<br/>تعديل إنقاذ، بعد التحميل، استخراج",
"group_tips" => "<li> 1. لا يمكن تكرار اسم مجموعة المستخدم ، بعد تعديل اسم المجموعة ، فإنها تنتمي إلى المستخدم المعاد تنظيمها وترتبط تلقائيًا. </li><li> 2. الحد من العلاقة بين أمن النظام ، يرجى توخي الحذر <i>(إذا قمت بإنشاء php جديد في دليل الويب ؛ فهذا يعني أن تغيير أذونات البرنامج لهذا المستخدم يكاد يكون مستحيلاً)</i> </li><li> 3. إدارة الأسرة ، وإدارة مجموعة الحقوق ، ومشاهدة الحقوق وإضافة وحذف وحذف الحقوق مرتبطة ، وترتبط البرامج تلقائيا </li><li> 4. بعد تعيين مجموعة الإذن لإضافة مجموعة الإذن ، لا يتم الحصول على الإذن التالي <i>(هذا الإذن يعادل أعلى إذن).</i> </li>",
"not_null" => "الحقول المطلوبة لا يمكن أن يكون فارغا!",
"picture_can_not_null" => "صور لا يمكن أن يكون فارغا!",
"rname_success" => "إعادة تسمية النجاح!",
"please_inpute_search_words" => "الرجاء إدخال سلسلة للبحث عن",
"remove_success" => "حذف بنجاح!",
"remove_fali" => "حذف فشل!",
"clipboard_null" => "الحافظة فارغة!",
"create_success" => "نجاح جديد!",
"create_error" => "فشل جديد، والتحقق من أذونات الدليل!",
"copy_success" => "[نسخ] - تغطية نجاح الحافظة!",
"cute_success" => "[قطع] - تغطية نجاح الحافظة!",
"clipboard_state" => "وضع الحافظة:",
"no_permission_write_all" => "الملف أو الدليل غير قابل للكتابة",
"no_permission_write_file" => "لايوجد ملف إذن الكتابة",
"no_permission_read_all" => "الملف أو الدليل لا يوجد لديه إذن القراءة",
"copy_not_exists" => "لا وجود مصدر",
"current_has_parent" => "المجلد الهدف هو مجلد فرعي من المجلد المصدر!",
"past_success" => "<b>اكتمال عملية اللصق</b>",
"cute_past_success" => "اكتمال<b>عملية قطع</b>(تم حذف الملف المصدر، الحافظة فارغة)",
"zip_success" => "ضغط الانتهاء",
"not_zip" => "لا أرشيف",
"zip_null" => "لم يتم تحديد ملف أو دليل",
"unzip_success" => "بفك كاملة",
"gotoline" => "القفز إلى خط",
"path_is_current" => "المسار والمسار الحالي لفتح نفسها!",
"path_exists" => "الاسم موجود بالفعل!",
"undo" => "إلغاء",
"redo" => "مكافحة إلغاء",
"preview" => "المعاينة",
"wordwrap" => "التفاف",
"show_gutter" => "تظهر أرقام الأسطر",
"char_all_display" => "تظهر الأحرف غير مرئية",
"auto_complete" => "يطالب تلقائيا",
"auto_save" => "حفظ تلقائيا",
"function_list" => "قائمة وظيفة",
"code_theme" => "الترميز ستايل",
"font_size" => "حجم الخط",
"confirm" => "هل تريد بالتأكيد القيام بذلك؟",
"button_ok" => "حدد",
"button_submit" => "عرض",
"button_set" => "نصب",
"button_cancel" => "ألغيت",
"button_edit" => "تحرير",
"button_save" => "حفظ",
"button_apply" => "تطبق",
"button_save_all" => "حفظ الكل",
"button_not_save" => "لا تقم بحفظ",
"button_add" => "إضافة",
"button_back_add" => "العودة إلى إضافة",
"button_del" => "حذف",
"button_save_edit" => "حفظ التغييرات",
"button_save_submit" => "حفظ إرسال",
"button_more" => "أكثر",
"button_select_all" => "تحديد الكل / عكس التحديد",
"charset_AUTO" => "تحديد تلقائي",
"charset_UTF_8" => "Unicode",
"charset_UTF_16" => "Unicode",
"charset_CP1256" => "العربية",
"charset_ISO_8859_6" => "العربية",
"charset_ISO_8859_10" => "اللغات الاسكندنافية",
"charset_CP1257" => "لغات البلطيق",
"charset_ISO_8859_13" => "لغات البلطيق",
"charset_ISO_8859_4" => "لغات البلطيق",
"charset_BIG5_HKSCS" => "繁体-香港",
"charset_BIG5" => "繁体-台湾",
"charset_Georgian_Academy" => "الجورجية",
"charset_PT154" => "الكازاخية",
"charset_CP949" => "الكورية",
"charset_EUC_KR" => "الكورية",
"charset_GB18030" => "الصينية المبسطة",
"charset_GBK" => "الصينية المبسطة",
"charset_ISO_8859_14" => "سلتيك",
"charset_CP1133" => "لاو",
"charset_ISO_8859_16" => "الرومانية",
"charset_ISO_8859_3" => "جنوب أوروبا",
"charset_EUC_JP" => "اليابانية",
"charset_ISO_2022_JP" => "اليابانية",
"charset_SHIFT_JIS" => "اليابانية",
"charset_KOI8_T" => "اللغة الطاجيكية",
"charset_ISO_8859_11" => "التايلاندية",
"charset_TIS_620" => "التايلاندية",
"charset_CP1254" => "اللغة التركية",
"charset_CP1251" => "السيريلية",
"charset_ISO_8859_5" => "السيريلية",
"charset_KOI8_R" => "السيريلية",
"charset_KOI8_U" => "السيريلية",
"charset_CP1252" => "اللغات الأوروبية الغربية",
"charset_ISO_8859_1" => "اللغات الأوروبية الغربية",
"charset_ISO_8859_15" => "اللغات الأوروبية الغربية",
"charset_Macintosh" => "اللغات الأوروبية الغربية",
"charset_CP1255" => "العبرية",
"charset_ISO_8859_8" => "العبرية",
"charset_CP1253" => "اللغة اليونانية",
"charset_ISO_8859_7" => "اللغة اليونانية",
"charset_ARMSCII_8" => "الأرميني",
"charset_CP1258" => "الفيتنامية",
"charset_VISCII" => "الفيتنامية",
"charset_CP1250" => "اللغات الأوروبية المركزية",
"charset_ISO_8859_2" => "اللغات الأوروبية المركزية",
"charset_default_set" => "ترميز ملف",
"charset_convert_save" => "حفظ الملف المشفرة كما",
"PluginCenter" => "مركز التوصيل",
"PluginBuy" => "إذن الشراء",
"PluginInstalled" => "تم تثبيت",
"PluginUpdate" => "تحديث",
"PluginListNull" => "لا يوجد أي محتوى!",
"PluginType" => "تصنيف",
"PluginTypeAll" => "كامل",
"PluginTypeFile" => "ملف المحسن",
"PluginTypeSafe" => "أدوات الأمن",
"PluginTypeTools" => "فائدة",
"PluginTypeMedia" => "الوسائط المتعددة",
"PluginTypeOthers" => "آخر",
"PluginInstall" => "تثبيت المكونات",
"PluginEnable" => "تمكين المكونات الإضافية",
"PluginDisable" => "تعطيل",
"PluginRemove" => "إلغاء تثبيت المكونات",
"PluginConfig" => "تكوين المساعد",
"PluginStatus" => "دولة",
"PluginStatusEnabled" => "تمكين",
"PluginStatusDisabled" => "لم يتم تمكين",
"PluginStatusNotInstall" => "لا المثبتة",
"PluginInstalling" => "تركيب ...",
"PluginHasUpdate" => "التحديثات",
"PluginUpdateStart" => "تحديث المكونات في",
"PluginNeedConfig" => "الحاجة إلى تمكين التكوين الأولي",
"PluginConfigNotNull" => "الحقول المطلوبة لا يمكن أن يكون فارغا!",
"PluginOpen" => "فتح",
"PluginAuther" => "مؤلف",
"PluginVersion" => "طبعة",
"PluginDownloadNumber" => "التثبيت",
"PluginBack" => "عودة",
"PluginReadme" => "وصف",
"PluginResetConfig" => "استعادة الإعدادات الافتراضية",
"PluginInstallSelf" => "التثبيت اليدوي",
"Plugin.config.auth" => "أذونات",
"Plugin.config.authDesc" => "كافة الإعدادات المتاحة، أو تحديد المستخدمين، ومجموعات المستخدمين وجماعات حقوق يمكن استخدام",
"Plugin.config.authOpen" => "الدخول المفتوح",
"Plugin.config.authOpenDesc" => "لا حاجة لزيارة يمكن الوصول إليها، ويمكن استخدامها للاتصال الخارجي واجهة",
"Plugin.config.authAll" => "حائز",
"Plugin.config.authUser" => "المستخدم",
"Plugin.config.authGroup" => "قسم مخصص",
"Plugin.config.authRole" => "جماعة حقوقية",
"Plugin.Config.openWith" => "أسلوب مفتوح",
"Plugin.Config.openWithDilog" => "الحوار الداخلي",
"Plugin.Config.openWithWindow" => "فتح صفحة جديدة",
"Plugin.Config.fileSort" => "الأولوية جمعية الإرشاد",
"Plugin.Config.fileSortDesc" => "أكبر التمديد لفتح أولوية أعلى",
"Plugin.Config.fileExt" => "تنسيقات الملفات المدعومة",
"Plugin.Config.fileExtDesc" => "تمديد المرتبطة في المكونات",
"Plugin.tab.basic" => "الإعدادات الأساسية",
"Plugin.tab.auth" => "أذونات",
"Plugin.tab.others" => "الإعدادات الأخرى",
"Plugin.default.aceEditor" => "محرر الآس",
"Plugin.default.htmlView" => "معاينة صفحة ويب",
"Plugin.default.picasa" => "بيكاسا صورة التصفح",
"Plugin.default.zipView" => "Archive Preview",
"Plugin.default.jPlayer" => "لاعب jPlayer",
"Plugin.auth.viewList" => "قائمة المكونات الإضافية",
"Plugin.auth.setting" => "إعدادات البرنامج المساعد",
"Plugin.auth.status" => "إيقاف",
"Plugin.auth.install" => "تثبيت / إلغاء",
"Explorer.UI.openWith" => "حدد فتح",
"Explorer.UI.openWithText" => "المفكرة لفتح",
"Explorer.UI.appSetDefault" => "تعيين مفتوحة الافتراضي",
"Explorer.UI.appAwaysOpen" => "دائما استخدام البرنامج المحدد لفتح هذا الملف",
"Explorer.UI.selectAppDesc" => "حدد البرنامج الذي تريد فتح هذا الملف",
"Explorer.UI.selectAppWarning" => "يرجى اختيار التطبيق!",
"Explorer.UI.appTypeSupport" => "أيد",
"Explorer.UI.appTypeAll" => "جميع التطبيقات",
"kodApp.oexe.edit" => "تحرير تطبيق الضوء",
"kodApp.oexe.open" => "فتح التطبيق من الضوء"
);
+33
View File
@@ -0,0 +1,33 @@
<div class="box">
<div class="title"><span>KODExplorer т.е. Какво?</span></div>
<p>KODExplorer е с отворен код, уеб-базирани управление на онлайн документ, редактор на код. Тя осигурява един вид класически Windows потребителски интерфейс, набор от онлайн управление на документи, файл преглед, редактиране, качване, изтегляне, разархивирайте онлайн възпроизвеждане на музика. Позволява да се постигне уеб програмиране директно в браузъра, изходния код файл преглед, и разположи собственика на сайта и местната операцията толкова лесно, бързо и безопасно опит.</p>
<p><b>- дизайн -</b></p>
<p>класическата традиция, стремежът към иновации, за да предоставят на потребителите с удобен, сигурен и лесен за използване онлайн система за управление на облак.</p>
<p>когато (когато), където (където), има в интернет всеки път, когато искате (искате) е вашият инструмент за управление (4W политика).</p>
<p><b>- потребителски ориентирани -</b></p>
<p>в момента система за управление на KODExplorer разположени главно в личния Cloud Hosting, малък предприятието облак ресурси, управление на мрежата диск, управление на малки и средни обекти. Web Developer & Мастер (ветерани): онлайн редактор, компресиран бекъп, разгръщане, класически експлоатация прозорци интерфейс, Лесно е да започнете и да се отървете от SSH домакин, FTP команда сложни сондажни работи.</p>
<p>личен частен облак (новобранец): Управление на мрежови дискови ресурси, на същата операция класически Windows интерфейс, можете да поставите музика Преглед на мрежовото устройство на, телевизори файлове, качване и сваляне на бързо и лесно.</p>
</div>
<div class="box">
<div class="title"><span>Удобства</span></div>
<p>цялостна управление на документи, мощен онлайн файл редактор</p>
<p>където и да сте, можете да управлявате вашите файлове и онлайн забавление, онлайн код писане! Само като подходящи за използване като операционната система.</p>
<p>обширна полето местен опит трансплантация операция, плъзгане, избор кутия, бързи клавиши, търсене на файлове (съдържание търсене) ......</p>
<p>подбор кутия, плъзгане движение, влачене и пускане качването, онлайн редактор, видео плейър, декомпресиране. Пълен Аякс изпълнение гаранция и опит!</p>
<p>всяка функция директна непрекъсната връзка; в диалоговия форма, функции за управление на много задачи</p>
<p>Editor поддържа мулти-документ; подкрепа ZendCoding HTML, CSS, JS-висока ефективността на кодирането!</p>
<p>перфектен китайски подкрепа, чете решават различни ситуации;</p>
</div>
<div class="box">
<div class="title"><span>отворен код технология приемане</span></div>
<p><b>1.Jquery:</b>jpuery (плъгин: Hotkeys.ztree.contentmenu) .js мейнстрийм рамка за развитие. Операция на операцията по Dom, BOM, операцията CSS, и Аякс пакет</p>
<p><b>2.ArtDialog:</b>красив дизайн, силно браузър съвместимост диалоговия джаджа. Така че поп-нагоре дръжка, събития, и предаване на данни, за да получите по-добра единно управление</p>
<p><b>3.Ztree:</b>контрол списък дърво, мащабируемост е много силен дърво манипулация на данни джаджа</p>
<p><b>4.codemirror:</b>редактор код JS плъгини, поддържа множество програмни езици за подчертаване</p>
<p><b>5.zendcoding:</b>опора HTML кодове бърз запис на плъгини. Опростява определението на код е написан. Обикновено компилация</p>
<p><b>6.less:</b>ефективност, функционален модел на развитие CSS, за да се подобри предния край на CSS стилове повторна употреба на , Обикновено компилация</p>
<p><b>7.SWFUpload:</b>флаш качване на файлове</p>
<p><b>8 .CMP4:</b>много добър играч флаш плъгин мултимедийни файлове, поддръжка на поточна медия, популярен инструмент за възпроизвеждане на музика видео. Подкрепа за кожата, силно конфигурируеми настройки. Dynamic списък XML зареден. MMS поточна медия, RSTP отворен лиценз източник подкрепа за възпроизвеждане на носители</p>
</div>
+72
View File
@@ -0,0 +1,72 @@
<div class="intro-left">
<div class="tips blue">
<h1> <span>Богата функционалност</span> </h1>
<p> Код автоматично подсказва </p>
<p> Multi-тема: Изберете вашия любим програмиране стил </p>
<p> По поръчка на шрифта: за употреба на сцена </p>
<p> Multi редактиране на курсора, за редактиране на блок онлайн опит в програмирането, сравнима с възвишеното </p>
<p> Блок сгъване, разширяване; увийте </p>
<p> Поддръжка на множество табове, плъзнете превключване последователност; </p>
<p> Поддържането на множество документи, търсене и заместване; История; </p>
<p> Auto-пълна [], {}, (), &#39;&#39; &#39;&#39; </p>
<p> Онлайн преглед в реално време, която ви позволява да се влюби в програми онлайн! </p>
<p> zendcodeing подкрепа, пишат код осемдесет </p>
<p> Допълнителни функции чакат за вашето откритие ...... </p>
</div>
<div class="tips orange">
<h1> <span>150 вида код Отбелязването</span> </h1>
<p> Съвет: HTML, JavaScript, CSS, по-малко, дързък, SCSS </p>
<p> Web Design: PHP, Perl, Python, рубин, elang, отиде ... </p>
<p> Традиционните езици: Java, C, C ++, C #, ActionScript, VBScript ... </p>
<p> Други: евтино, черупки, SQL, Lua, XML, YAML ... </p>
</div>
</div>
<div class="intro-right">
<div class="tips green">
<h1> <span>Shortcut действие</span> </h1>
<pre> Обикновено използваните комбинации:
Ctrl + S за да запаметите
Ctrl + A изберете всички Ctrl + х Cut
Ctrl + C Ctrl + V паста копие
Ctrl + Z Undo Undo Anti Ctrl + Y
Ctrl + F, за да се намери замяна Ctrl + F + F
Win + ALT + 0 колапс всички победа + Alt + Shift + 0 Отваряне на всички
ESC [търсене Exit отменя автоматично подсказва ...]
Ctrl-Shift-ите Preview
Ctrl-Shift-д шоу &amp; Close функция
</pre>
<pre> Изберете:
Mouse палатка - драг
SHIFT + начало / край / нагоре / ляво / надолу / надясно
SHIFT + PageUp / PageDown флип нагоре и надолу, за да изберете
Ctrl + Shift + начало / край на текущата курсора в началото и края
ALT + мишката, за да плъзнете селекцията на блок
Ctrl + Alt + г партида изберете и въведете текущата редактор мулти-таб
</pre>
<pre> Курсор:
начало / край / нагоре / ляво / надолу / надясно
Ctrl + начало / край преместите курсора на документ главата / опашката
Ctrl + P Идете на съвпадение тагове
PageUp / PageDown курсора нагоре и надолу
ALT + лява / дясна стрелка, за да се премести в горната част на линията
Shift + ляво / дясно на курсора до края на реда и
Ctrl + L, за да скочи до специфичен ред
Ctrl + Alt + нагоре / надолу (по-долу) се увеличи на курсора
</pre>
<pre> Edit:
Ctrl + / Коментар &amp; разкоментирайте Ctrl + Alt + обосновано
раздела маса смяна подравняване + маса общата маса напредък
изтриване изтриване изтриване на цялата линия Ctrl + D
Ctrl + Delete, за да изтриете ред на правилната дума
Ctrl / Shift + Backspace, за да изтриете думата в ляво
ALT + SHIFT + нагоре / надолу и се добавя към линията на копие (по-долу) самолет
Alt + Delete, за да изтриете съдържанието на правото на курсора
ALT + нагоре / надолу на текущия ред и ред (следващия обмен линия) на
Ctrl + Shift + D редове копирани и добавени към следното
Ctrl + Delete, за да изтриете правото на думата
Ctrl + Shift + U превърнати в малки букви
Ctrl + U избран текст в главни букви
</pre>
</div>
</div>
+36
View File
@@ -0,0 +1,36 @@
<div class="box">
<div class="title"> <span>Управление на файлове</span> </div>
<p><i class="icon-tags"></i> File Selection: радио, мишка палатка, смени изборите, Ctrl случайно избран, клавиатурата нагоре и надолу, у дома, край селекция. </p>
<p><i class="icon-folder-open"></i> операция на файла: След като изберете даден файл, можете да копирате, нарязани, изтриване, разглеждане на свойствата на компресия, преименувате, отворен за визуализация и други операции ...... </p>
<p><i class="icon-cloud-upload"></i> Качване на файлове: Качване на множество файлове партида; HTML5 плъзгане качване (плъзнете, за да безпроблемно качване прозорец, влачене и пускане подкрепа за папки) </p>
<p><i class="icon-cogs"></i> Право функция: десния файл, папка, нали, по-точно след операция на изборите, десктоп, надясно, надясно директория дърво, прав-обвързани бързи команди от менюто <br/>
(Select All - Copy - Cut - Paste - Изтриване - Преименуване, определен ......) </p>
<p><i class="icon-sitemap"></i> File Browser: Режим Списък, режим икона; двукратно върху в подпапки; адресната лента операция; отворите запис папка противоречащи запис (напред и назад) </p>
<p><i class="icon-move"></i> Подкрепа влачене и пускане: Проверете плъзгане, нарязани да се постигне определен функцията папка </p>
<p><i class="icon-reply"></i> Бързи клавиши: изтриване изтриване, Ctrl + A Select All, Ctrl + C за копиране, + X Cut, търсене на файлове (търсене на съдържание) Ctrl </p>
</div>
<div class="box">
<div class="title"> <span>Преглед на файла</span> </div>
<p><i class="icon-edit"></i> Преглед на файла: видите съдържанието на редактиране на текстов файл и спестяване; HTML, SWF файл преглед, </p>
<p><i class="icon-picture"></i> Преглед на снимката: автоматично генериране на миниатюри, графични слайд шоу; </p>
<p><i class="icon-music"></i> Аудио възпроизвеждане: играят онлайн музика и видео файлове; поддръжка MP3, WMA, средата, AAC, WAV, mp4, </p>
<p><i class="icon-play"></i> Видео: онлайн видео възпроизвеждане, поддържаните формати: Flv, F4V, 3gp </p>
<p><i class="icon-play"></i> офис: преслушване, поддържаните формати: док, DOCX, PPT, PPTX, XLS, XLSX </p>
</div>
<div class="box">
<div class="title"> <span>Shortcuts</span> </div>
<p><i class="icon-tags"></i> въведете Open </p>
<p><i class="icon-tags"></i> Ctrl + A изберете всички </p>
<p><i class="icon-tags"></i> Ctrl + C, за да копирате избрания </p>
<p><i class="icon-tags"></i> Ctrl + V, за да поставите </p>
<p><i class="icon-tags"></i> Ctrl + х Cut </p>
<p><i class="icon-tags"></i> Ctrl + F за да търсите в текущата директория </p>
<p><i class="icon-tags"></i> ALT + N New File </p>
<p><i class="icon-tags"></i> ALT + m New Folder </p>
<p><i class="icon-tags"></i> изтриване Изтриване на избрания </p>
<p><i class="icon-tags"></i> Backspace Back </p>
<p><i class="icon-tags"></i> Ctrl + Backspace напред </p>
<p><i class="icon-tags"></i> f2 Rename избран (папка) </p>
<p><i class="icon-tags"></i> начало / край / нагоре / надолу / наляво / надясно, за да изберете файла </p>
<p><i class="icon-tags"></i> Anykey Проверете, за да натиснете първата буква на символни файлове и папки, избран автоматичен цикъл </p>
</div>
+804
View File
@@ -0,0 +1,804 @@
<?php
return array(
"path_api_select_file" => "Моля, изберете файла, ...",
"path_api_select_folder" => "Моля изберете папка ...",
"path_api_select_image" => "Моля изберете изображение ...",
"share_can_upload" => "Оставя качване",
"move_error" => "Движете се провали",
"setting_basic" => "Основни настройки",
"setting_user_sound_open" => "Open Sound",
"setting_user_animate_open" => "Open Анимация",
"recycle_open_if" => "Отворете кошчето",
"recycle_open" => "отворено",
"setting_user_recycle_desc" => "След изтриването ще бъде изтрито директно физическо изтриване",
"setting_user_animate_desc" => "Прозорец отворен и друга анимация",
"setting_user_sound_desc" => "Работен звук",
"setting_user_imageThumb" => "Миниатюри на картини",
"setting_user_imageThumb_desc" => "По-добро преживяване при сърфиране след отваряне",
"setting_user_fileSelect" => "Отворете иконата на файла за проверка",
"setting_user_fileSelect_desc" => "Икона на файла за проверка на левия бутон, щракнете с десния бутон на мишката върху менюто",
"qrcode" => "URL QR код",
"theme_mac" => "Mac минималистичен бял",
"theme_win7" => "Windows 7",
"theme_win10" => "Windows 10",
"theme_metro" => "Metro Blue Classic",
"theme_metro_green" => "Metro светло зелено",
"theme_metro_purple" => "Metro елегантна лилава",
"theme_metro_pink" => "Metro Rose",
"theme_metro_orange" => "Metro ярко оранжево",
"theme_alpha_image" => "Bright - летене",
"theme_alpha_image_sun" => "Bright - Sunset",
"theme_alpha_image_sky" => "Symphony - Blue Sky",
"theme_diy" => "<b>персонализирана</b>",
"theme_diy_title" => "Настройки обичай тема",
"theme_diy_background" => "фон",
"theme_diy_image" => "снимка",
"theme_diy_color_blur" => "Gradient цвят",
"theme_diy_image_blur" => "Снимка на размазването",
"theme_diy_image_url" => "Снимки адрес",
"theme_diy_color_start" => "Започвайки цвят",
"theme_diy_color_end" => "Край Color",
"theme_diy_color_radius" => "Gradient ъгъл",
"system_role_admin_set" => "Администраторите имат всички права, без да се определят!",
"login_error_user_not_use" => "Потребителят е деактивиран! Моля, свържете се с администратора",
"login_error_kod_version" => "Версия конфликт",
"login_error_role" => "Преглед на разрешенията група не съществува, моля свържете се с администратора",
"no_permission_group" => "Вие не сте в тази група!",
"no_permission_write" => "Директорията не разполага с права за запис",
"user" => "потребител",
"save_as" => "Запази като",
"check_update" => "Актуализация",
"keyboard_type" => "клавиатура Mode",
"font_family" => "Fonts",
"code_mode" => "Оцветяване на синтаксиса",
"path_can_not_share" => "Поддържа споделяне само на собствените си документи!",
"path_can_not_action" => "Тази директория не поддържа тази операция!",
"wap_page_pc" => "PC версия",
"wap_page_phone" => "подвижен",
"image_size" => "размери на изображението",
"no_permission_action" => "Не е нужно това разрешение, моля, свържете се с администратора!",
"path_is_root_tips" => "Той е дошъл в главната директория!",
"kod_group" => "организация",
"my_kod_group" => "Аз съм в отдела",
"space_tips_default" => "(GB) 0 Няма ограничение",
"space_tips_full" => "Без да се ограничава",
"space_size" => "пространство",
"space_size_use" => "Използване на пространството",
"space_is_full" => "Няма останало достатъчно място, моля свържете се с администратора!",
"system_open_true_path" => "Успешно открит през файловия мениджър!",
"group_role_error" => "Роля разрешения грешка (няма настройки разрешение)",
"group_role_error_admin" => "Недостатъчни разрешения",
"markdown_content" => "Съдържание",
"system_group" => "Потребители и отдели",
"system_group_edit" => "Управление на отдела",
"system_group_role" => "Роля идентичност",
"system_group_create" => "Нов отдел",
"system_group_name" => "Име на отдел",
"system_group_father" => "Отличен отдел",
"system_group_add" => "Добавете подразделение",
"system_group_remove" => "Премахнете отдела",
"system_group_remove_tips" => "Наистина ли искате да изтриете отдела?<br/>След премахването на частта от потребителя ще бъде премахнат, подсектор се премества в корен сектор",
"system_group_select" => "Изберете отдел",
"system_group_select_result" => "Членовете ще принадлежат към следните сектори",
"system_role_admin_tips" => "Забележки: Системните администратори не са упълномощени да контролират",
"system_member_action" => "Управление на потребители",
"system_member_add" => "New User",
"system_member_role" => "Разрешение роли",
"system_member_role_select" => "Изберете",
"system_member_password_tips" => "Не пълнете не модифициран",
"system_set_home_path" => "по поръчка Каталог",
"system_set_home_path_tips" => "директория по подразбиране е празна",
"system_member_group" => "Къде е отдела",
"system_member_group_edit" => "Редакционен отдел",
"system_member_remove" => "Изтриване на потребителя",
"system_member_remove_tips" => "Потвърдете изтриване на потребителя?<br/>, след като се премахне потребителската директория ще бъде напълно изтрит",
"system_member_set_role" => "За да потвърдите промяната на избраните разрешенията за употреба на групата?",
"system_member_remove_group" => "Определяне на избрания потребител ще бъде напълно премахнато от тази група?",
"system_member_import" => "Bulk добавка",
"system_member_import_desc" => "Един потребител на ред,<br/>, вече съществуват, са тихо игнорирани",
"system_member_use" => "Активиране",
"system_member_unuse" => "правя неспособен",
"system_member_space" => "Задайте размера на потребителското пространство ",
"system_member_space_tips" => " Задайте размера на потребителското пространство ",
"system_member_space_number" => " Трябва да е число!",
"system_member_group_config" => "Отдел за определяне на партиди",
"system_member_group_remove" => "Премахнат от отдела",
"system_member_group_insert" => "Добавете към отдела",
"system_member_group_reset" => "Нулирайте отдела",
"system_member_group_error" => "Грешка в отдела",
"system_group_action" => "Управление на отдела",
"system_role_add" => "Добави Роля Identity",
"system_role_read" => "Само за четене",
"system_role_write" => "Може да чете и да пише",
"system_setting_root_path" => "достъп Root",
"system_setting_root_path_desc" => "Само системен администратор може да получите достъп до всички директории, групи други права на потребители могат да виждат само собствените си потребителски директории. Ако искате да включите или изключите<br/>администраторски достъп до други директории, можете да промените РНР open_basedir параметри анти-между сайтове,<a href=\"https://www.google.com.hk/search?&q=php+open_basedir\" target=\"_lank\">настроен</a>",
"system_group_role_title" => "Управление на ролята на отдела",
"system_group_role_remove" => "OK, за да изтриете ролята на отдел",
"system_group_role_style" => "стил",
"system_group_role_display" => "дали",
"system_group_role_display_desc" => "Задайте дали да се показват потребителски права на отдел",
"role_type_name_read" => "чета",
"role_type_name_read:list" => "Списък на файловете",
"role_type_name_read:info" => "File (папка) имот View, търсене Папка",
"role_type_name_read:copy" => "архивен екземпляр",
"role_type_name_read:preview" => "Визуализацията на файла (снимки, документи, аудио и видео)",
"role_type_name_read:download" => "File (папка) Изтегли",
"role_type_name_write" => "пиша",
"role_type_name_write:add" => "Създаване на файл (папка), извличане на компресиран файл",
"role_type_name_write:edit" => "Запазете файла за редактиране",
"role_type_name_write:change" => "Преименуване, коригира структурата на директория",
"role_type_name_write:upload" => "File (папка) да качвате, дистанционно изтегляне",
"role_type_name_write:remove" => "File (папка) изтриване, нарязани",
"group_guest" => "посетители",
"group_guest_desc" => "Вие не сте член на отдела,<br/>има достъп само до [разделена директория на отдела] следното съдържание, разрешения само за четене.",
"group_role_lebel_desc" => "Вие сте член на този отдел,<br/>Всички документи в катедрата Всички права запазени от администратора",
"button_save_and_add" => "Запазване и продължаване, за да добавите",
"path_cannot_search" => "Директорията не поддържа търсенето!",
"not_support" => "Не се поддържа!",
"group_not_exist" => "Потребителят група не съществува!",
"upload_clear_all" => "Изчистване на всички",
"upload_clear" => "Clear Завършен",
"upload_setting" => "Настройте",
"upload_tips" => "Използва парче качване, вече не подлежи на php.ini лимит; препоръчва плъзгане хром папка и капка качването опит",
"upload_exist" => "Файл със същото име",
"upload_exist_rename" => "преименувам",
"upload_exist_replace" => "капак",
"upload_exist_skip" => "подскачам",
"upload_add_more" => "Bulk добавка",
"more" => "още",
"system_setting" => "Настройки на системата",
"openProject" => "Отворете редактора на проект",
"url_download" => "Изтегляне",
"url_link" => "URL",
"app_type_link" => "Shortcuts",
"createLink" => "Създаване на пряк път",
"createLinkHome" => "Изпратено до прекия път на работния плот",
"createProject" => "Като прибавим към проекта на редактора",
"only_read" => "Само за четене",
"only_read_desc" => "Директорията не разполага с права за запис<br/>Можете да зададете разрешения за тази директория на сървъра,",
"not_read" => "нечетлив",
"explorerNew" => "код връзка",
"zip_download_ready" => "След компресия автоматично ще изтеглите, моля изчакайте ...",
"set_background" => "Задай като Desktop Wallpaper",
"share" => "дял",
"my_share" => "Моят дял",
"group_share" => "Групово външно споделяне",
"share_edit" => "Редактирайте споделянето",
"share_remove" => "Отмяна на споделянето",
"share_remove_tips" => "Наистина ли искате да анулирате споделянето? Обществената връзка ще бъде деактивирана.",
"share_path" => "Споделете пътя",
"share_title" => "Споделяне на ресурси",
"share_name" => "Споделете заглавието",
"share_time" => "изтичане",
"share_time_desc" => "Null не е настроено",
"share_password" => "Екстракт парола",
"share_password_desc" => "Празно няма зададена парола",
"share_cancle" => "премахване на споделянето",
"share_create" => "Създаване на обществена връзка",
"share_url" => "Споделено Адрес",
"share_not_download" => "Изтегляне забрана",
"share_not_download_tips" => "Шарер забранен за сваляне!",
"share_code_read" => "Код четец",
"share_save" => "Save Configuration",
"share_error_param" => "Параметър грешка!",
"share_error_user" => "Информация за потребител Грешка!",
"share_error_sid" => "Share не съществува!",
"share_error_time" => "Вие идват твърде късно, делът е изтекъл!",
"share_error_path" => "Споделено файл не съществува, той ще бъде изтрит или го отстранява!",
"share_error_password" => "Грешна парола!",
"share_error_show_tips" => "Този тип не поддържа файл преглед!",
"share_view_num" => "Прегледи:",
"share_download_num" => "Downloads:",
"share_open_page" => "Отворете споделена страница",
"open_the_path" => "Въведете директория",
"recycle_clear" => "Изпразване на кошчето",
"recycle_clear_success" => "Изпразване на кошчето успех!",
"recycle_clear_info" => "Сигурни ли сте, че искате да се изпразни напълно боклука?",
"fav_remove" => "Отмени колекцията",
"remove_item" => "Предмети",
"uploading" => "Качване",
"upload_tips_more" => "Твърде много файлове, препоръката на сгъстен качването, след това разархивирайте онлайн!",
"uploading_move" => "В прехвърлянето на сливането ...",
"show_file" => "Нова страница преглед",
"unknow_file_title" => "File Open Съвет!",
"unknow_file_tips" => "Не подкрепя прилагането на този файл, можете да:",
"unknow_file_try" => "опитвам",
"unknow_file_download" => "Изтеглете файла",
"unknow_plugin_search" => "инсталирани Търсене приложения, свързани с",
"config_save_error_auth" => "Неуспешно запазване на конфигурацията, администраторът забрани тази привилегия!",
"config_save_error_file" => "Грешка, файлът не е достъпна за писане!",
"beautify_code" => "Код Formatter",
"convert_case" => "дело преобразуване",
"convert_upper_case" => "Реализирано в главни букви",
"convert_lower_case" => "Реализирано в малки букви",
"editor_insert_time" => "Текущо време ",
"editor_md5" => " Md5 криптиране ",
"editor_qrcode" => " Кодиран двуизмерен код ",
"editor_regx" => " Изпитване на регулярен израз ",
"editor_chinese" => " Опростена реализация ",
"editor_chinese_simple" => " Преобразуване в опростен китайски ",
"editor_chinese_traditional" => " Преобразуване в традиционен китайски ",
"editor_base64" => "Base64 кодек ",
"editor_base64_encode" => " Кодиране на Base64 ",
"editor_base64_decode" => " Base64 декодиране ",
"editor_url" => " URL кодек ",
"editor_url_encode" => " Кодиране на URL адресите ",
"editor_url_decode" => " URL декодиране ",
"editor_unicode" => " Unicode кодек ",
"editor_unicode_encode" => " Кодиране с Unicode ",
"editor_unicode_decode" => " Unicode декодиране",
"editor_tools_select_tips" => " Моля, изберете съдържанието, което искате да конвертирате!",
"editor_calc" => "Безплатен Калкулатор",
"shortcut" => "Shortcuts",
"use_free" => "Продължете да използвате безплатната версия",
"learn_more" => "Научете повече",
"replace" => "Замяна",
"selectAll" => "Изберете",
"reload" => "Презареди",
"about" => "за",
"complete_current" => "Авто-завършване на тока",
"view" => "изглед",
"tools" => "инструмент",
"help" => "Помощ",
"not_exists" => "Не съществува",
"group_role_fileDownload" => "Downloads",
"group_role_share" => "дял",
"users_share" => "подялба",
"system_setting_save" => "Настройки за сигурност",
"system_setting_menu" => "управление Меню",
"system_name" => "програма Наименование",
"system_name_desc" => "Програма лого заглавие",
"system_desc" => "Описание на програмата",
"path_hidden" => "Directory изключвания",
"version_not_support" => "Вашата версия не поддържа този, моля посетете официалния сайт за закупуване на новата версия!",
"version_not_support_number" => "Тъй като броят на ограничение не поддържа тази операция, моля купя новата версия на официалния сайт!",
"path_hidden_desc" => "Директории и файлове по подразбиране не показват, разделени със запетаи",
"new_user_folder" => "Най-новият потребител е създадена от директорията по подразбиране",
"new_user_folder_desc" => "Разделени със запетаи",
"new_user_app" => "Най-новият потребител е създадена от приложението по подразбиране",
"new_user_app_desc" => "Заявленията за кандидатстване център, множество разделени със запетаи",
"auto_login" => "Посетителите автоматично влизане",
"auto_login_desc" => "Стандартната вход потребителското<code>guest/guest</code>потребители; след отваряне за да се гарантира, че съществува на потребителя",
"first_in" => "След като влезете в по подразбиране",
"version_price_free" => "безплатно",
"version_name_1" => "VIP 1",
"version_name_2" => "VIP 2",
"version_name_3" => "VIP 3",
"version_name_4" => "VIP 4",
"version_name_5" => "VIP 5",
"version_name_6" => "VIP 6",
"version_vip_free" => "Free",
"version_vip_1" => "VIP 1",
"version_vip_2" => "VIP 2",
"version_vip_3" => "VIP 3",
"version_vip_4" => "VIP 4",
"version_vip_5" => "VIP 5",
"version_vip_6" => "VIP 6",
"path_can_not_write_data" => "Directory не е достъпна за писане, задаване на директория и всички поддиректории за да се опита отново след четене и запис!",
"menu_name" => "име Menu",
"menu_hidden" => "крия",
"menu_show" => "показ",
"menu_move_down" => "надолу",
"menu_move_up" => "нагоре",
"menu_move_del" => "изтривам",
"menu_open_window" => "Отваряне на нов прозорец",
"menu_sub_menu" => "Подменю",
"url_path" => "URL адрес",
"url_path_desc" => "URL адрес или JS код",
"no_permission_read" => "Вие нямате разрешение да чете!",
"no_permission_download" => "Не е нужно разрешение за сваляне!",
"php_env_check" => "Работна среда мониторинг:",
"php_env_error" => "Липсва PHP библиотеката",
"php_env_error_ignore" => "Игнорирай и въведете",
"php_env_error_version" => "PHP версия не може да бъде по-малко от 5.0",
"php_env_error_path" => "Не е достъпна за писане",
"php_env_error_list_dir" => "Вашият уеб сървър отваря директорията листинг функция от съображения за сигурност, деактивирате тази функция!<a href=\"https://www.google.com.hk/#newwindow=1&safe=strict&q=web+server+turn+off+directory+listing\" target=\"blank\">как?</a>",
"php_env_error_gd" => "Php GD библиотека трябва да бъде отворена, в противен случай кода, използвайте миниатюрата няма да функционира правилно",
"install_login" => "Можете да използвате следната вход сметка",
"install_enter" => "системата",
"install_user_default" => "Администратор: {0} / (долу зададете парола) <br/> Средна потребител: {1} <br/> Гости: {2}",
"login_root_password" => "Определете администраторската парола",
"login_root_password_repeat" => "Потвърди паролата отново",
"login_root_password_equal" => "Двете пароли не съвпадат!",
"login_root_password_tips" => "Задайте парола на администратор!",
"forget_password" => "Забравена парола",
"forget_password_tips" => "Забравена Administrator Password: <br/> Моля, влезте сървъра изтриване <b>./data/system/install.lock</b> нулиране; <br/><br/> Non-администратор Забравена парола: <br/> Моля, свържете се с администратора, за да изчисти!",
"copyright_desc" => "Kodexplorer е силно аплодирана система за управление на уеб документ, можете да го използвате за вътрешно управление на документи или споделена, може да се използва и върху сървъра за управление на сайта, на мястото на Ftp, дори като webIDE директно онлайн развитие. Можете също така да програмирате втория развитие да включи този в съществуващите си системи.",
"copyright_contact" => "Contact us:kodcloud@qq.com <a>.</a> <a href=\"javascript:core.openWindow('http://bbs.kodcloud.com/');\">Feedback</a>",
"copyright_info" => "Copyright © <a href=\"https://kodcloud.com/?kodref=%s\" target=\"_blank\">kodcloud.com</a>.",
"copyright_pre" => "Powered by KodExplorer",
"kod_name" => "KodExplorer",
"kod_name_desc" => "Mango облак • Explorer",
"kod_power_by" => " - Powered by KodExplorer",
"kod_name_copyright" => "Mango облак • Explorer",
"kod_meta_name" => "KodExplorer",
"kod_meta_keywords" => "KodExplorer, код, kodCloud, WebOS, webIDE, PHP filemanage, filemanage, Dao в облак, манго, системи за управление на документи, предприятието облак диск, изследовател ,, онлайн документация, онлайн офис, онлайн офис, онлайн CAD преглед, онлайн редактиране , онлайн редактор",
"kod_meta_description" => "KodExplorer може да замъгли Road (по-рано манго облак) е водещ доставчик на държавни / корпоративни частни облаци и онлайн система за лични сайтове за управление на документи, предприятието частен облак внедрявания, съхранение мрежа, онлайн управление на документи, онлайн офис за предоставяне на безопасен и контролиран, просто и лесно употреба, силно персонализирани частни облачни продукти. С помощта на Windows интерфейс стил, експлоатационни практики, без да се налага да се адаптират към бързо да започнете, подкрепят стотици популярен преслушване файлов формат, възпроизвеждане и редактиране на щадящи околната среда, мощен е, след като пробен период, вече не е неразделна част от частния облак предложения.",
"kod_meta_copyright" => "kodcloud.com",
"login" => "Влезте,",
"guest_login" => "Гост Вход",
"username" => "Вход в профила",
"userNickName" => "Потребителски псевдоним",
"password" => "парола",
"login_code" => "кодове",
"need_check_code" => "код Вход удостоверяване отворен",
"need_check_code_desc" => "След като влезете, трябва да въведете кода за потвърждение.",
"setting_csrf_protect" => "Open защита CSRF",
"setting_csrf_protect_desc" => "След тип отваряне на атака може ефективно да защити CSRF",
"login_rember_password" => "Запомни паролата",
"setting_show_root_group" => "Посочете всички отдели",
"setting_show_root_group_desc" => "Коренът на директорията на дърводелетата трябва да посочи дали всички отдели са изброени",
"setting_show_share_user" => "Списък на всички потребители",
"setting_show_share_user_desc" => "Коренният отдел на директорията на дърветата е изброен за споделяне на всички потребители",
"setting_clear_user_recycle" => "Изпразните кошчето за всички потребители",
"setting_clear_cache" => "Изчистване на кеш паметта",
"setting_icp" => "Copyright или запис номер",
"setting_global_css" => "Персонализирана глобалната CSS",
"setting_global_css_desc" => "Всички страници ще въведе потребителски CSS",
"setting_global_html" => "Статистически код HTML",
"setting_global_html_desc" => "Всички страници ще бъде включен в този параграф HTML код, кодът може да се постави статистика на трети страни",
"us" => "kodcloud.com",
"login_not_null" => "Потребителско име и парола не може да бъде празно!",
"code_error" => "кодове на грешки",
"password_error" => "Потребителско име или парола е неправилна!",
"password_not_null" => "Паролата не може да бъде празно!",
"old_password_error" => "Old парола е грешна!",
"permission" => "Разрешение!",
"permission_edit" => "Промяна на разрешенията",
"file_info_owner" => "собственик",
"file_info_group" => "група",
"no_permission" => "Администраторът е забранил тази привилегия!",
"no_permission_ext" => "Administrator забрани този вид файловите права",
"dialog_max" => "Увеличете",
"dialog_min" => "Минимизиране",
"dialog_min_all" => "Минимизиране на всички",
"dialog_display_all" => "Показване на всички прозорци",
"dialog_close_all" => "Затваряне на всички",
"open" => "отворено",
"others" => "друг",
"open_with" => "Отворете за ...",
"close" => "близо",
"close_all" => "Затваряне на всички",
"close_left" => "Затваряне на ляво раздела",
"close_right" => "Затваряне на разделите отдясно",
"close_others" => "Close Other",
"loading" => "Операция ...",
"warning" => "предупреждение",
"getting" => "Получите ...",
"sending" => "Предаване на данни ...",
"data_error" => "Грешка на данни!",
"get_success" => "Вземи успех!",
"save_success" => "Успешно запазена!",
"success" => "успешна операция",
"error" => "операцията е неуспешна",
"error_repeat" => "Операцията се провали, името вече съществува!",
"word_error" => "неуспех ",
"word_success" => " успех",
"system_error" => "Системна грешка",
"name" => "име",
"type" => "тип",
"contain" => "съдържат",
"address" => "местоположение",
"size" => "размер",
"byte" => "байт",
"path" => "път",
"action" => "експлоатационен",
"create_time" => "Създаден",
"modify_time" => "Модифициран",
"last_time" => "Последно посещение",
"sort_type" => "Сортиране по",
"time_type" => "Y/m/d H:i:s",
"time_type_info" => "Y/m/d H:i:s",
"public_path" => "Public директория",
"system_path_not_change" => "Система директория, не може да бъде променен",
"file" => "досие",
"folder" => "папка",
"copy" => "копие",
"past" => "пръчка",
"clone" => "Създаване на копие",
"cute" => "срязване",
"cute_to" => "Преместване на ...",
"copy_to" => "Копие до ...",
"remove" => "изтривам",
"remove_force" => "премахнете напълно",
"info" => "имот",
"list_type" => "изглед",
"list_icon" => "Икона масив",
"list_list" => "договореност Списък",
"list_list_split" => "режим Колона",
"sort_up" => "увеличение",
"sort_down" => "Намаляване",
"order_type" => "Сортиране по",
"order_desc" => "Низходящо",
"order_asc" => "възходящ",
"rename" => "преименувам",
"add_to_fav" => "Добави в Любими",
"search_in_path" => "Търсене на папки",
"add_to_play" => "Добавяне към плейлист",
"manage_fav" => "Управление на любимите",
"refresh_tree" => "Обновяване директория дърво",
"manage_folder" => "Управление Directory",
"close_menu" => "Затваряне на менюто",
"zip" => "Създайте компресиран пакет",
"unzip" => "За да се извлече ...",
"unzip_folder" => "Разархивирайте в папка",
"unzip_this" => "Екстракт на тока",
"unzip_to" => "За да се извлече ...",
"zipview_file_big" => "Файлът е твърде голям, и след това се извлича операцията за преглед!",
"clipboard" => "Вижте Clipboard",
"clipboard_clear" => "Празен клипборда",
"full_screen" => "Full Screen",
"folder_info_item" => "Предмети",
"folder_info_item_select" => "А избрано",
"file_load_all" => "Кликнете два пъти върху, за да се зареди всички ......",
"tips" => "бърз",
"ziping" => "Компресирането ...",
"unziping" => "Извличане ...",
"moving" => "Mobile операция ...",
"remove_title" => "Изтриване Потвърждение",
"remove_info" => "Потвърди, за да изтриете избрания елемент?",
"remove_title_force" => "постоянно изтрит",
"remove_info_force" => "Сигурни ли сте, вие искате да изтриете завинаги този документ?",
"name_isexists" => "Грешен, на име вече съществува!",
"install" => "инсталирам",
"width" => "широчина",
"height" => "високо",
"app" => "леки Приложения",
"app_store" => "леки Приложения",
"app_create" => "Създаване на приложения",
"app_edit" => "Промяна на заявлението",
"app_group_all" => "пълен",
"app_group_game" => "игра",
"app_group_tools" => "инструмент",
"app_group_reader" => "чета",
"app_group_movie" => "телевизия",
"app_group_music" => "музика",
"app_group_life" => "живот",
"app_group_others" => "друг",
"app_desc" => "описание",
"app_icon" => "икона Applications",
"app_icon_show" => "URL адрес или директорията",
"app_group" => "Packet Application",
"app_type" => "тип",
"app_type_url" => "връзка",
"app_type_code" => "разширение JS",
"app_display" => "външност",
"app_display_border" => "Без граници (т.е. изберете полета)",
"app_display_size" => "Resize (Проверете за настройка)",
"app_size" => "размер",
"app_url" => "Link адрес",
"app_code" => "JS код",
"edit" => "редактирам",
"edit_can_not" => "Не е текстов файл",
"edit_too_big" => "Файлът е твърде голям, той не може да бъде по-голяма от 40M",
"open_default" => "Default Open",
"open_ie" => "Отворете браузъра",
"refresh" => "Обновяване",
"refresh_all" => "Сили на опресняване",
"newfile" => "New File",
"newfile_save_as" => "Запази в",
"newfolder" => "New Folder",
"newothers" => "New Други",
"path_loading" => "Зарежда се ...",
"go" => "Разходка!",
"go_up" => "Горен слой",
"history_next" => "напред",
"history_back" => "отстъпление",
"address_in_edit" => "Кликнете, за да въведете режим на редактиране",
"double_click_rename" => "Кликнете два пъти върху преименуването",
"double_click_open" => "Кликнете два пъти върху, за да отворите",
"path_null" => "Folder е празен!",
"file_size_title" => "Икона Размер",
"file_size_small_super" => "Ultra-малък",
"file_size_small" => "Малки икони",
"file_size_default" => "Икони",
"file_size_big" => "Големи икони",
"file_size_big_super" => "Голям Икона",
"upload" => "Качи",
"upload_ready" => "В очакване на качване",
"upload_success" => "Качване успешно",
"upload_path_current" => "Превключване към текущата директория",
"upload_select" => "Изберете File",
"upload_max_size" => "Максимално допустимото",
"upload_size_info" => "Ако искате да изберете повече, моля, променете php.ini максимално разрешено качване. Когато изберете даден файл по-голям от тази конфигурация автоматично ще филтрира.",
"upload_error" => "неуспешно качване",
"upload_error_http" => "Мрежовите защитни стени и грешки",
"upload_muti" => "Multi-качване на файлове",
"upload_drag" => "Плъзгане и пускане на качване",
"upload_drag_tips" => "Разхлабете за качване!",
"path_not_allow" => "име на файла не е позволено",
"download" => "Изтегляне",
"downloading" => "Зарежда се ...",
"download_address" => "Изтегляне",
"download_ready" => "Ще бъдат изтеглени",
"download_success" => "Свали успех!",
"download_error" => "Download Failed!",
"download_error_create" => "Напиши грешка!",
"download_error_exists" => "Линк към файла не бе успешно!",
"upload_error_null" => "Не файл!",
"upload_error_big" => "Размерът на файла е над допустимите граници за сървъри",
"upload_error_move" => "Неуспешно преместване на файл!",
"upload_error_exists" => "Файлът вече съществува",
"upload_local" => "Местно Качи",
"download_from_server" => "дистанционно за изтегляне",
"save_path" => "Save Path",
"upload_select_muti" => "Множество избираем за качване на файлове",
"search" => "търсене",
"searching" => "Търсене ...",
"search_result" => "Резултати от търсенето",
"seach_result_too_more" => "Прекалено много резултати, се препоръчва за директория или думи",
"search_null" => "Няма резултати!",
"search_uplow" => "дело чувствителна",
"search_content" => "Съдържание на търсачка",
"search_info" => "Моля въведете дума за търсене и търсене пътеки!",
"search_ext_tips" => "Чрез | разделени; например PHP | JS | CSS<br/>не пълнете търсене по подразбиране текстов файл",
"file_type" => "Тип на файла",
"goto" => "Направо към",
"server_dwonload_desc" => "Задача беше добавен в списъка за изтегляне",
"parent_permission" => "Родител правата на директориите",
"root_path" => "Моите документи",
"lib" => "склад",
"fav" => "Bookmark",
"desktop" => "Desktop",
"browser" => "Browser",
"my_computer" => "My Computer",
"recycle" => "боклук",
"my_document" => "Моите документи",
"my_picture" => "Моите снимки",
"my_music" => "Моята музика",
"my_movie" => "Моите видеоклипове",
"my_download" => "Моите Downloads",
"ui_desktop" => "Desktop",
"ui_explorer" => "Управление на файлове",
"ui_editor" => "редактор",
"adminer" => "adminer",
"ui_project_home" => "Проект Начало",
"ui_login" => "Влезте,",
"ui_logout" => "Quit",
"setting" => "Настройки на системата",
"setting_title" => "Опции",
"setting_user" => "Лична Center",
"setting_password" => "Смяна на паролата",
"setting_password_old" => "Old Password",
"setting_password_new" => "Ревизираната да",
"setting_language" => "Езикови настройки",
"setting_member" => "Управление на потребители",
"setting_group" => "Управление на потребителите група",
"setting_group_add" => "Добави User Group",
"setting_group_edit" => "Edit Потребителски групи",
"setting_theme" => "Настройки тема",
"setting_wall" => "Настройки на тапета",
"setting_wall_desktop" => "Тапет за настолни компютри",
"setting_wall_desktop_list" => "Управление на тапети на работния плот",
"setting_wall_login_list" => "Вход за управление на тапети",
"setting_wall_login_tips" => "Съвет: Когато има повече от едно парче, фона на интерфейса за влизане ще се върти произволно",
"setting_wall_diy" => "По поръчка тапети:",
"setting_wall_info" => "Снимка URL адрес, местните снимки могат да бъдат правилни, за да получите на браузъра, за да отворите изображението",
"setting_fav" => "диспечер на отметките",
"setting_help" => "Използване на Помощ",
"setting_about" => "За произведения",
"setting_success" => "Промяна е влязло в сила!",
"can_not_repeat" => "Не е позволено да се повтаря",
"absolute_path" => "Абсолютен адрес",
"group" => "Потребителски групи",
"data_not_full" => "Данни, подадени непълна!",
"default_user_can_not_do" => "потребителя по подразбиране не може да работи",
"default_group_can_not_do" => "Default потребителски групи не могат да работят",
"username_can_not_null" => "Потребителско име не може да бъде празно!",
"groupname_can_not_null" => "Прякор група не може да бъде празно!",
"groupdesc_can_not_null" => "Потребител Група Описание не може да бъде празно!",
"group_move_user_error" => "Потребителски потребители Група движение провалиха",
"group_already_remove" => "Потребителската група е изтрит",
"group_not_exists" => "Тази група потребители не съществува",
"member_add" => "Добавяне на потребител",
"password_null_not_update" => "Те казаха, че не промените паролата не е попълнено",
"if_save_file_tips" => "Някои файлове не са запазени. Сигурни ли сте, че сте затворили прозореца?",
"if_save_file" => "Файлът не е бил спасен, който искате да запишете?",
"if_remove" => "Потвърдете Изтриване",
"member_remove_tips" => "След като премахнете потребителската директория ще бъде изчистена",
"group_remove_tips" => "След като премахнете потребителската група на потребителите, не мога да вляза<br/>(трябва отново да зададете потребителска група)",
"group_name" => "Прякор група",
"group_name_tips" => "Препоръка английски име, не може да се повтаря",
"group_desc" => "Име за показване",
"group_desc_tips" => "Наименование Група Описание",
"group_role_ext" => "ограничения Удължители",
"group_role_ext_tips" => "С множествена | разделени",
"group_role_file" => "Управление на файлове",
"group_role_upload" => "Оставя качване",
"group_role_user" => "данни за потребителя",
"group_role_group" => "Управление на потребителите група",
"group_role_member" => "Управление на потребители",
"group_role_mkfile" => "New File",
"group_role_mkdir" => "New Folder",
"group_role_pathrname" => "преименувам",
"group_role_pathdelete" => "заличаване на файлове",
"group_role_pathinfo" => "File Properties",
"group_role_pathmove" => "Move (копие / изрязване / паста / влачене операция)",
"group_role_zip" => "компресия",
"group_role_unzip" => "отварям се",
"group_role_search" => "търсене",
"group_role_filesave" => "Запазете файла за редактиране",
"group_role_can_upload" => "Качване и сваляне",
"group_role_download" => "дистанционно за изтегляне",
"group_role_passowrd" => "Смяна на паролата",
"group_role_config" => "данни за конфигуриране",
"group_role_fav" => "операции Bookmark (Добавяне / редактиране / изтриване)",
"action_list" => "Списък View",
"action_add" => "Добави",
"action_edit" => "редактирам",
"action_del" => "изтривам",
"group_role_ext_warning" => "Качването не позволи на такива файлове,<br/>Преименуване (преименуван на посочения разширение),<br/>Редактиране спаси, дистанционно изтегляне, екстракт",
"group_tips" => "<li> 1. Името на групата потребители не може да бъде дублирано. След като името на групата бъде променено, то принадлежи на реорганизирания потребител и автоматично се асоциира. </li><li> 2. Разширенията ограничават връзката между сигурността на системата, бъдете внимателни <i>(ако създадете нов php в уеб директорията, това означава, че промяната на разрешенията на програмата на този потребител е практически невъзможна)</i> </li><li> 3. Управление на домакинствата, управление на права, права за гледане и добавяне, изтриване и изтриване на права, програми автоматично се свързват </li><li> 4. След като разрешителната група е настроена да добави групата разрешения, последващото разрешение не е наследено <i>(това разрешение е еквивалентно на най-високото разрешение).</i> </li>",
"not_null" => "Задължителните полета не могат да бъдат празни!",
"picture_can_not_null" => "Снимките не могат да бъдат празни!",
"rname_success" => "Преименуване на успех!",
"please_inpute_search_words" => "Моля, въведете низ за търсене",
"remove_success" => "Изтрит успешно!",
"remove_fali" => "Изтриване неуспешно!",
"clipboard_null" => "Clipboard е празна!",
"create_success" => "Нов успех!",
"create_error" => "New неуспешна, проверете правата за достъп до директорията!",
"copy_success" => "[Copy] - покриваща клипборд успех!",
"cute_success" => "[Cut] - покриваща клипборд успех!",
"clipboard_state" => "Clipboard статус:",
"no_permission_write_all" => "Файлът или директорията не е достъпна за писане",
"no_permission_write_file" => "Файлът не разполага с права за запис",
"no_permission_read_all" => "Файлът или директорията не разполага с разрешение за четене",
"copy_not_exists" => "Източник не съществува",
"current_has_parent" => "Целева папка е подпапка на папката източник!",
"past_success" => "<b>операция паста е завършена</b>",
"cute_past_success" => "<b>операция нарязани приключи</b>(източник файл се изтрива, клипборда празна)",
"zip_success" => "Compression завършена",
"not_zip" => "Не архив",
"zip_null" => "Не е избран файл или директория",
"unzip_success" => "Разархивирайте пълна",
"gotoline" => "Направо към линията",
"path_is_current" => "Пътят и текущия път да отвори едно и също!",
"path_exists" => "Името вече съществува!",
"undo" => "отменяне",
"redo" => "Anti отмяна",
"preview" => "предварителен преглед",
"wordwrap" => "Wrap",
"show_gutter" => "Покажи Line Numbers",
"char_all_display" => "Покажи невидими знаци",
"auto_complete" => "Автоматично подканва",
"auto_save" => "Автоматично запазване",
"function_list" => "Списък Function",
"code_theme" => "Coding Style",
"font_size" => "Размер на шрифта",
"confirm" => "Наистина ли искате да направите това?",
"button_ok" => "Определя",
"button_submit" => "Подайте",
"button_set" => "Настройте",
"button_cancel" => "отменен",
"button_edit" => "редактирам",
"button_save" => "Save",
"button_apply" => "Нанесете",
"button_save_all" => "Save All",
"button_not_save" => "Не спести",
"button_add" => "Добави",
"button_back_add" => "Обратно, за да добавите",
"button_del" => "изтривам",
"button_save_edit" => "Запазване на промените",
"button_save_submit" => "Запазване Подайте",
"button_more" => "още",
"button_select_all" => "Избиране на всички / Invert Selection",
"charset_AUTO" => "Автоматична идентификация",
"charset_UTF_8" => "Unicode",
"charset_UTF_16" => "Unicode",
"charset_CP1256" => "арабски",
"charset_ISO_8859_6" => "арабски",
"charset_ISO_8859_10" => "скандинавските езици",
"charset_CP1257" => "балтийските езици",
"charset_ISO_8859_13" => "балтийските езици",
"charset_ISO_8859_4" => "балтийските езици",
"charset_BIG5_HKSCS" => "繁体-香港",
"charset_BIG5" => "繁体-台湾",
"charset_Georgian_Academy" => "грузински",
"charset_PT154" => "казахски",
"charset_CP949" => "корейски",
"charset_EUC_KR" => "корейски",
"charset_GB18030" => "опростен китайски",
"charset_GBK" => "опростен китайски",
"charset_ISO_8859_14" => "келтски",
"charset_CP1133" => "Лао",
"charset_ISO_8859_16" => "румънски",
"charset_ISO_8859_3" => "Южна Европа",
"charset_EUC_JP" => "японски",
"charset_ISO_2022_JP" => "японски",
"charset_SHIFT_JIS" => "японски",
"charset_KOI8_T" => "таджикски език",
"charset_ISO_8859_11" => "Thai",
"charset_TIS_620" => "Thai",
"charset_CP1254" => "турски",
"charset_CP1251" => "кирилица",
"charset_ISO_8859_5" => "кирилица",
"charset_KOI8_R" => "кирилица",
"charset_KOI8_U" => "кирилица",
"charset_CP1252" => "Западноевропейски езици",
"charset_ISO_8859_1" => "Западноевропейски езици",
"charset_ISO_8859_15" => "Западноевропейски езици",
"charset_Macintosh" => "Западноевропейски езици",
"charset_CP1255" => "иврит",
"charset_ISO_8859_8" => "иврит",
"charset_CP1253" => "гръцки",
"charset_ISO_8859_7" => "гръцки",
"charset_ARMSCII_8" => "арменски",
"charset_CP1258" => "виетнамски",
"charset_VISCII" => "виетнамски",
"charset_CP1250" => "Централни европейски езици",
"charset_ISO_8859_2" => "Централни европейски езици",
"charset_default_set" => "File Encoding",
"charset_convert_save" => "Спасете кодиран като файл",
"PluginCenter" => "Plug център",
"PluginBuy" => "Разрешение за закупуване",
"PluginInstalled" => "Е инсталиран",
"PluginUpdate" => "Актуализация",
"PluginListNull" => "Няма съдържание!",
"PluginType" => "класификация",
"PluginTypeAll" => "пълен",
"PluginTypeFile" => "Засилено файл",
"PluginTypeSafe" => "Инструменти за сигурност",
"PluginTypeTools" => "полезност",
"PluginTypeMedia" => "мултимедия",
"PluginTypeOthers" => "друг",
"PluginInstall" => "Инсталиране на приставката",
"PluginEnable" => "Активиране на приставки",
"PluginDisable" => "правя неспособен",
"PluginRemove" => "Деинсталиране на щепсела",
"PluginConfig" => "Конфигуриране на приставката",
"PluginStatus" => "състояние",
"PluginStatusEnabled" => "Enabled",
"PluginStatusDisabled" => "Не е активирано",
"PluginStatusNotInstall" => "не е инсталирано",
"PluginInstalling" => "Инсталация ...",
"PluginHasUpdate" => "Актуализациите",
"PluginUpdateStart" => "Актуализиране на приставката",
"PluginNeedConfig" => "Необходимостта да се даде възможност на първоначалната конфигурация",
"PluginConfigNotNull" => "Задължителните полета трябва да се попълнят!",
"PluginOpen" => "отворено",
"PluginAuther" => "автор",
"PluginVersion" => "издание",
"PluginDownloadNumber" => "Инсталира",
"PluginBack" => "връщане",
"PluginReadme" => "описание",
"PluginResetConfig" => "Възстановете настройките по подразбиране",
"PluginInstallSelf" => "Ръчна инсталация",
"Plugin.config.auth" => "Разрешения",
"Plugin.config.authDesc" => "Всички на наличните настройки, свързани с определяне на потребителите, потребителски групи, правозащитни организации могат да използват",
"Plugin.config.authOpen" => "Отворен достъп",
"Plugin.config.authOpenDesc" => "Няма нужда да посещавате, може да се използва за външно разговор",
"Plugin.config.authAll" => "притежател",
"Plugin.config.authUser" => "потребител",
"Plugin.config.authGroup" => "Определен отдел",
"Plugin.config.authRole" => "група права",
"Plugin.Config.openWith" => "Open стил",
"Plugin.Config.openWithDilog" => "Вътрешен диалоговия",
"Plugin.Config.openWithWindow" => "Новата страница се отваря",
"Plugin.Config.fileSort" => "приоритет Extension асоциация",
"Plugin.Config.fileSortDesc" => "Колкото по-голям разширението, за да отворите по-висок приоритет",
"Plugin.Config.fileExt" => "Поддържани файлови формати",
"Plugin.Config.fileExtDesc" => "Свързани Удължаване на приставката",
"Plugin.tab.basic" => "Основни настройки",
"Plugin.tab.auth" => "Разрешения",
"Plugin.tab.others" => "Други настройки",
"Plugin.default.aceEditor" => "Ace Редактор",
"Plugin.default.htmlView" => "Web Page Preview",
"Plugin.default.picasa" => "сърфиране в Picasa картина",
"Plugin.default.zipView" => "Archive Preview",
"Plugin.default.jPlayer" => "jPlayer играч",
"Plugin.auth.viewList" => "Списък с добавки",
"Plugin.auth.setting" => "Настройки на приставките",
"Plugin.auth.status" => "Изключете",
"Plugin.auth.install" => "Инсталиране / Деинсталиране",
"Explorer.UI.openWith" => "Изберете Open",
"Explorer.UI.openWithText" => "Notepad за да отворите",
"Explorer.UI.appSetDefault" => "Задайте открито по подразбиране",
"Explorer.UI.appAwaysOpen" => "Винаги използвайте избраната програма да отвори този файл",
"Explorer.UI.selectAppDesc" => "Изберете програмата, която искате да отворите този файл",
"Explorer.UI.selectAppWarning" => "Моля, изберете приложението!",
"Explorer.UI.appTypeSupport" => "Поддържани",
"Explorer.UI.appTypeAll" => "Всички приложения",
"kodApp.oexe.edit" => "Редактиране на светлинното приложение",
"kodApp.oexe.open" => "Отворете приложението на светлината"
);
Binary file not shown.
+72
View File
@@ -0,0 +1,72 @@
<div class="intro-left">
<div class="tips blue">
<h1> <span>রিচ কার্যকারিতা</span> </h1>
<p> কোড স্বয়ংক্রিয়ভাবে অনুরোধ জানানো হবে </p>
<p> মাল্টি থিম: আপনার প্রিয় প্রোগ্রামিং শৈলী চয়ন করুন </p>
<p> কাস্টম ফন্ট: দৃশ্য এ ব্যবহারের জন্য </p>
<p> মাল্টি কার্সার এডিটিং, ব্লক সম্পাদনা অনলাইন প্রোগ্রামিং অভিজ্ঞতা মহিমান্বিত তুলনীয় </p>
<p> ব্লক ভাঁজ, প্রসারিত; মোড়ানো </p>
<p> একাধিক ট্যাব জন্য সমর্থন, সুইচিং ক্রম টেনে আনুন; </p>
<p> একাধিক নথি নিয়ন্ত্রণের, অনুসন্ধান ও প্রতিস্থাপন; ইতিহাস; </p>
<p> অটো-সম্পূর্ণ [], {}, (), &#39;&#39; &#39;&#39; </p>
<p> অনলাইন রিয়েল টাইম প্রিভিউ যে আপনি অনলাইন প্রোগ্রামিং সঙ্গে প্রেমে পড়া করতে সক্ষম হবেন! </p>
<p> সমর্থন zendcodeing, কোড আশি লিখতে </p>
<p> আরও বৈশিষ্ট্য আপনার আবিষ্কারের জন্য অপেক্ষা ...... </p>
</div>
<div class="tips orange">
<h1> <span>কোড হাইলাইটিং 150 ধরণের</span> </h1>
<p> টিপ: এইচটিএমএল, জাভাস্ক্রিপ্ট, সিএসএস, কম, Sass, এসসিএসএস </p>
<p> ওয়েব ডেভেলপমেন্ট: পিএইচপি, পার্ল, পাইথন, রুবি, elang, যেতে ... </p>
<p> পরম্পরাগত ভাষায়: জাভা, সি, সি ++, সি #, ActionScript, VB স্ক্রিপ্ট ... </p>
<p> অন্য: markdown, শেল, এসকিউএল, Lua, এক্সএমএল, yaml ... </p>
</div>
</div>
<div class="intro-right">
<div class="tips green">
<h1> <span>শর্টকাট অ্যাকশন</span> </h1>
<pre> সাধারণভাবে ব্যবহৃত শর্টকাট:
Ctrl + s সংরক্ষণ করতে
Ctrl + A নির্বাচন সব Ctrl + X কাটা
Ctrl + C Ctrl + V পেস্ট কপি
Ctrl + Z ফেরান এন্টি Ctrl + Y
Ctrl + F প্রতিস্থাপন Ctrl + F + F এটি
জয় + Alt + 0 ধসের সব জয় + Alt + Shift + 0 সম্প্রসারণ
Esc [প্রস্থান অনুসন্ধান স্বয়ংক্রিয়ভাবে বাতিল করার অনুরোধ জানানো হবে ...]
Ctrl-Shift-এর প্রি
Ctrl-Shift-ই শো &amp; বন্ধ ফাংশন
</pre>
<pre> চয়ন করুন:
মাউস তাবু - ড্র্যাগ
Shift + হোম / শেষ / আপ / বাম / নিচে / ডান
Shift + PageUp / PageDown নির্বাচন করতে নিচে আপ টুসকি
Ctrl + Shift + Home / আদ্যন্ত বর্তমান কার্সার শেষে
Alt + মাউস ব্লক নির্বাচন টানুন
Ctrl + Alt + ছ ব্যাচ নির্বাচন এবং বর্তমান মাল্টি ট্যাব সম্পাদক লিখুন
</pre>
<pre> কার্সার:
হোম / শেষ / আপ / বাম / নিচে / ডান
Ctrl + Home / শেষ ডকুমেন্ট মাথা / লেঙ্গুড় কার্সরটিকে
মিলে ট্যাগে Ctrl + P ঝাঁপ দাও
PageUp / PageDown আপ এবং ডাউন কার্সার
Alt + বাম / ডান কার্সার লাইনের শীর্ষে যাওয়ার জন্য
লাইনের শেষ shift + বাম / ডান কার্সার &amp;
Ctrl + L একটি নির্দিষ্ট সারি ঝাঁপ
Ctrl + Alt + আপ / ডাউন (নিচে) বৃদ্ধি কার্সার
</pre>
<pre> সম্পাদনা:
Ctrl + / মন্তব্য &amp; uncomment Ctrl + Alt + একটি যথার্থ প্রতিপন্ন
টেবিল ট্যাব প্রান্তিককরণ Shift + টেবিল সামগ্রিক অগ্রগতি টেবিল
সমগ্র লাইন Ctrl মুছতে মুছতে মুছতে + D
Ctrl + ডান শব্দ উপর সারি করার, মোছার
Ctrl / Shift + Backspace বাম থেকে শব্দ মুছে দিতে
জন্য alt + shift + আপ / ডাউন এবং কপি লাইন যোগ করা (নিচে) সমতল
Alt + কার্সার ডান বিষয়বস্তু করার, মোছার
Alt + আপ / ডাউন বর্তমান লাইন এবং লাইন (পরের লাইন বিনিময়) উপর
Ctrl + Shift + d সারি কপি এবং নিম্নলিখিত যোগ করা
Ctrl + শব্দের অধিকার করার, মোছার
Ctrl + Shift + U ছোটহাতের অক্ষরে রুপান্তরিত
Ctrl U নির্বাচিত লেখা + বড়হাতের
</pre>
</div>
</div>
+36
View File
@@ -0,0 +1,36 @@
<div class="box">
<div class="title"> <span>ফাইল ম্যানেজমেন্ট</span> </div>
<p><i class="icon-tags"></i> ফাইল নির্বাচন: রেডিও, মাউস তাবু, শিফট-নির্বাচন, Ctrl এলোমেলোভাবে নির্বাচিত, কীবোর্ড আপ এবং ডাউন, হোম, শেষ নির্বাচন. </p>
<p><i class="icon-folder-open"></i> ফাইল অপারেশন: একটি ফাইল নির্বাচন করা হলে, আপনি, কপি করা যাবে কাটা, মুছতে, কম্প্রেশন বৈশিষ্ট্য দেখতে, নামান্তর খোলা পূর্বরূপ দেখুন এবং অন্যান্য অপারেশন ...... </p>
<p><i class="icon-cloud-upload"></i> ফাইল আপলোড: আপলোড একাধিক ফাইল ব্যাচ; HTML5 ড্র্যাগ আপলোড (ড্র্যাগ অঙ্গীভূতভাবে উইন্ডোতে ড্র্যাগ আপলোড এবং ড্রপ ফোল্ডার জন্য সমর্থন) </p>
<p><i class="icon-cogs"></i> রাইট ফাংশন: রাইট-ফাইল, ফোল্ডার, ঠিক আছে, অধিকতর যোগ্য নির্বাচনের অপারেশনের পর, ডেস্কটপ, ডান, ডান ডিরেক্টরি ট্রি, ডান-আবদ্ধ মেনু শর্টকাট <br/>
(নির্বাচন করুন সকল - কপি - কাটা - পেস্ট - মুছে দিন - পুনঃনামকরণ, সেট ......) </p>
<p><i class="icon-sitemap"></i> ফাইল ব্রাউজার: তালিকা মোড, আইকন মোড; উপ-ফোল্ডার মধ্যে ডাবল ক্লিক করুন; ঠিকানা বার অপারেশন; একটি ফোল্ডার রেকর্ড contrarian রেকর্ড খুলুন (ফরোয়ার্ড এবং অনগ্রসর) </p>
<p><i class="icon-move"></i> সাপোর্ট ড্র্যাগ এবং ড্রপ: ড্র্যাগ চেক, উল্লিখিত ফোল্ডারটি ফাংশন অর্জন কাটা </p>
<p><i class="icon-reply"></i> শর্টকাট কী-সমূহ: মুছতে মুছতে, Ctrl + A নির্বাচন সকল, Ctrl + কপি সি + এক্স কাটা, ফাইল সার্চ (অনুসন্ধান বিষয়বস্তু) Ctrl </p>
</div>
<div class="box">
<div class="title"> <span>ফাইলের পূর্বরূপ</span> </div>
<p><i class="icon-edit"></i> ফাইল পূর্বরূপ: একটি টেক্সট ফাইল সম্পাদনা এবং সংরক্ষণ বিষয়বস্তু দেখতে; এইচটিএমএল, SWF ফাইল প্রিভিউ, </p>
<p><i class="icon-picture"></i> চিত্র পূর্বরূপ: থাম্বনেল, ইমেজ স্লাইড শো স্বয়ংক্রিয় প্রজন্ম; </p>
<p><i class="icon-music"></i> অডিও প্লেব্যাক: অনলাইন সঙ্গীত এবং ভিডিও ফাইল প্লে; সমর্থন MP3, WMA, মধ্য, AAC, WAV; MP4, </p>
<p><i class="icon-play"></i> ভিডিও: অনলাইন ভিডিও প্লেব্যাক, সমর্থিত বিন্যাসের: FLV, f4v, 3gp </p>
<p><i class="icon-play"></i> অফিস: অফিস অনলাইন প্রি, সমর্থিত বিন্যাসের: DOC, DOCX করা, ppt, pptx, xls, xlsx </p>
</div>
<div class="box">
<div class="title"> <span>শর্টকাট</span> </div>
<p><i class="icon-tags"></i> ওপেন প্রবেশ </p>
<p><i class="icon-tags"></i> Ctrl সব একটি নির্বাচন + </p>
<p><i class="icon-tags"></i> Ctrl + C কপি করার জন্য নির্বাচিত </p>
<p><i class="icon-tags"></i> Ctrl + V পেস্ট </p>
<p><i class="icon-tags"></i> Ctrl + X কাটা </p>
<p><i class="icon-tags"></i> Ctrl + বর্তমান ডিরেক্টরি অনুসন্ধান করতে চ </p>
<p><i class="icon-tags"></i> Alt + N নতুন ফাইল </p>
<p><i class="icon-tags"></i> Alt + M নতুন ফোল্ডার </p>
<p><i class="icon-tags"></i> মুছুন নির্বাচিত </p>
<p><i class="icon-tags"></i> ব্যাকস্পেস পিছনে </p>
<p><i class="icon-tags"></i> Ctrl + Backspace এগিয়ে </p>
<p><i class="icon-tags"></i> F2 নামকরণ নির্বাচিত (ফোল্ডার) </p>
<p><i class="icon-tags"></i> হোম / শেষ / আপ / ডাউন / বাম / ফাইল নির্বাচন করতে ডান </p>
<p><i class="icon-tags"></i> anykey স্বয়ংক্রিয় চক্র নির্বাচিত চরিত্র ফাইল এবং ফোল্ডারগুলি প্রথম অক্ষর টিপুন চেক </p>
</div>
+804
View File
@@ -0,0 +1,804 @@
<?php
return array(
"path_api_select_file" => "অনুগ্রহ করে ফাইলটি সিলেক্ট ...",
"path_api_select_folder" => "দয়া করে একটি ফোল্ডার নির্বাচন করুন ...",
"path_api_select_image" => "অনুগ্রহ করে একটি ছবি নির্বাচন করুন ...",
"share_can_upload" => "আপলোড করার অনুমতি দিন",
"move_error" => "সরান ব্যর্থ",
"setting_basic" => "বেসিক সেটিংস",
"setting_user_sound_open" => "ওপেন সাউন্ড",
"setting_user_animate_open" => "অ্যানিমেশন খুলুন",
"recycle_open_if" => "রিসাইকেল বিন খুলুন",
"recycle_open" => "খোলা",
"setting_user_recycle_desc" => "মুছে ফেলার পরে সরাসরি শারীরিক অপসারণ মুছে ফেলা হবে",
"setting_user_animate_desc" => "উইন্ডো খোলা এবং অন্যান্য অ্যানিমেশন",
"setting_user_sound_desc" => "অপারেশন শব্দ",
"setting_user_imageThumb" => "ছবি থাম্বনেইল",
"setting_user_imageThumb_desc" => "খোলার পরে ভাল ব্রাউজিং অভিজ্ঞতা",
"setting_user_fileSelect" => "ফাইল আইকন চেক খুলুন",
"setting_user_fileSelect_desc" => "ফাইল আইকন বাম কী চেক, ডান-ক্লিক করুন মেনু শর্টকাট এন্ট্রি",
"qrcode" => "URL টি QR কোড",
"theme_mac" => "ম্যাক অল্পস্বল্প সাদা",
"theme_win7" => "Windows 7",
"theme_win10" => "Windows 10",
"theme_metro" => "মেট্রো ব্লু ক্লাসিক",
"theme_metro_green" => "মেট্রো হালকা সবুজ",
"theme_metro_purple" => "মেট্রো মার্জিত রক্তবর্ণ",
"theme_metro_pink" => "মেট্রো রোজ",
"theme_metro_orange" => "মেট্রো উজ্জ্বল কমলা",
"theme_alpha_image" => "উজ্জ্বল - উড়ন্ত",
"theme_alpha_image_sun" => "উজ্জ্বল - সূর্যাস্ত",
"theme_alpha_image_sky" => "সিম্ফনি - ব্লু স্কাই",
"theme_diy" => "<b>কাস্টম</b>",
"theme_diy_title" => "কাস্টম থিম সেটিংস",
"theme_diy_background" => "পটভূমি",
"theme_diy_image" => "ছবি",
"theme_diy_color_blur" => "গ্রেডিয়েন্ট রঙ",
"theme_diy_image_blur" => "ছবি ব্লার",
"theme_diy_image_url" => "ফটো ঠিকানা",
"theme_diy_color_start" => "আরম্ভের রঙ",
"theme_diy_color_end" => "শেষ রঙ",
"theme_diy_color_radius" => "গ্রেডিয়েন্ট কোণ",
"system_role_admin_set" => "প্রশাসকগণ সেটিং ছাড়া, সব অধিকার আছে!",
"login_error_user_not_use" => "ব্যবহারকারীর অ্যাকাউন্ট নিষ্ক্রিয় করা হয়েছে! প্রশাসকের সাথে যোগাযোগ করুন",
"login_error_kod_version" => "সংস্করণ দ্বন্দ্ব",
"login_error_role" => "দেখুন অনুমতির গ্রুপ অস্তিত্ব নেই, প্রশাসকের সাথে যোগাযোগ করুন",
"no_permission_group" => "আপনি এই দলের না হয়!",
"no_permission_write" => "ডিরেক্টরি লেখার অনুমতি নেই",
"user" => "ব্যবহারকারী",
"save_as" => "যেমন সংরক্ষণ",
"check_update" => "আপডেট",
"keyboard_type" => "কীবোর্ড মোড",
"font_family" => "ফন্ট",
"code_mode" => "সিনট্যাক্স হাইলাইটিং",
"path_can_not_share" => "শুধুমাত্র আপনার নিজের নথি ভাগ সমর্থন!",
"path_can_not_action" => "এই ডিরেক্টরিটি এই অপারেশন সমর্থন করে না!",
"wap_page_pc" => "পিসি সংস্করণ",
"wap_page_phone" => "মোবাইল",
"image_size" => "চিত্র মাত্রা",
"no_permission_action" => "আপনি এই অনুমতি নেই, প্রশাসকের সাথে যোগাযোগ করুন দয়া করে!",
"path_is_root_tips" => "এটা রুট ডিরেক্টরিতে এসেছে!",
"kod_group" => "সংগঠন",
"my_kod_group" => "আমি ডিপার্টমেন্টে আছি",
"space_tips_default" => "(গিগাবাইট) 0 কোন সীমা",
"space_tips_full" => "সীমাবদ্ধ না করে",
"space_size" => "স্থান",
"space_size_use" => "স্থান ব্যবহার",
"space_is_full" => "পর্যাপ্ত স্থান নেই, প্রশাসকের সাথে যোগাযোগ করুন!",
"system_open_true_path" => "সফলভাবে ফাইল ম্যানেজার খোলা!",
"group_role_error" => "ভূমিকা অনুমতি ত্রুটি (কোন অনুমতি সেটিংস)",
"group_role_error_admin" => "পর্যাপ্ত অনুমতি উপস্থিত নেই",
"markdown_content" => "সূচীপত্র",
"system_group" => "ব্যবহারকারী এবং বিভাগ",
"system_group_edit" => "ডিপার্টমেন্ট ম্যানেজমেন্ট",
"system_group_role" => "ভূমিকা পরিচয়",
"system_group_create" => "নতুন বিভাগ",
"system_group_name" => "বিভাগের নাম",
"system_group_father" => "সুপেরিয়র বিভাগ",
"system_group_add" => "উপ-বিভাগ যোগ করুন",
"system_group_remove" => "বিভাগটি সরান",
"system_group_remove_tips" => "আপনি বিভাগটি মুছে ফেলার ব্যাপারে নিশ্চিত?<br/>the ব্যবহারকারীর অংশ মুছে ফেলার পরে, সাব-সেক্টর রুট সেক্টরে স্থানান্তরিত হবে",
"system_group_select" => "বিভাগ নির্বাচন করুন",
"system_group_select_result" => "সদস্য নিম্নলিখিত খাতে অধিকারে",
"system_role_admin_tips" => "মন্তব্য: সিস্টেম প্রশাসক নিয়ন্ত্রণ করতে অনুমোদিত নয়",
"system_member_action" => "ইউজার ম্যানেজমেন্ট",
"system_member_add" => "নতুন ইউজার",
"system_member_role" => "অনুমতি ভূমিকা",
"system_member_role_select" => "নির্বাচন করা",
"system_member_password_tips" => "পূরণ না পরিবর্তন করা",
"system_set_home_path" => "কাস্টম জায়",
"system_set_home_path_tips" => "ডিফল্ট ডিরেক্টরি খালি",
"system_member_group" => "কোথায় বিভাগ",
"system_member_group_edit" => "সম্পাদকীয় বিভাগ",
"system_member_remove" => "ব্যবহারকারী অপসারণ",
"system_member_remove_tips" => "ব্যবহারকারী অপসারণ নিশ্চিত করতে চান?<br/>আপনি ব্যবহারকারী ডিরেক্টরি সরানোর পর সম্পূর্ণরূপে মুছে ফেলা হবে",
"system_member_set_role" => "নির্বাচিত ব্যবহারকারীর গ্রুপ অনুমতি পরিবর্তন নিশ্চিত করার জন্য?",
"system_member_remove_group" => "নির্বাচিত ব্যবহারকারীর এই গ্রুপ থেকে সরানো হবে নির্ধারণ?",
"system_member_import" => "বাল্ক অ্যাড",
"system_member_import_desc" => "প্রতি লাইনে একটি ব্যবহারকারী,<br/>ইতিমধ্যে অস্তিত্ব চুপটি উপেক্ষা করা হয়",
"system_member_use" => "সক্ষম করা",
"system_member_unuse" => "অক্ষম",
"system_member_space" => "ব্যবহারকারীর স্থান আকার সেট করুন ",
"system_member_space_tips" => " ব্যবহারকারীর স্থান আকার সেট করুন ",
"system_member_space_number" => " একটি সংখ্যা হতে হবে!",
"system_member_group_config" => "ব্যাচ সেটিং ডিপার্টমেন্ট",
"system_member_group_remove" => "বিভাগ থেকে অপসারণ",
"system_member_group_insert" => "বিভাগ যোগ করুন",
"system_member_group_reset" => "বিভাগ পুনঃস্থাপন",
"system_member_group_error" => "বিভাগ ত্রুটি",
"system_group_action" => "ডিপার্টমেন্ট ম্যানেজমেন্ট",
"system_role_add" => "ভূমিকা পরিচয় যোগ",
"system_role_read" => "Read-only",
"system_role_write" => "পড়তে ও লিখতে পারে",
"system_setting_root_path" => "রুট অ্যাক্সেস",
"system_setting_root_path_desc" => "শুধু একজন সিস্টেম প্রশাসকের সব ডিরেক্টরি অ্যাক্সেস করতে পারেন, ব্যবহারকারীরা অন্য অধিকার সংগঠনগুলো শুধুমাত্র তাদের নিজস্ব ব্যবহারকারী ডাইরেক্টরি দেখতে পারেন। আপনার উপর বা অন্যান্য ডিরেক্টরি থেকে<br/>প্রশাসক অ্যাক্সেস বন্ধ করতে চান, আপনি, বিরোধী ক্রস সাইট পরামিতি open_basedir পিএইচপি পরিবর্তন করতে পারেন<a href=\"https://www.google.com.hk/search?&q=php+open_basedir\" target=\"_lank\"></a>",
"system_group_role_title" => "বিভাগীয় কর্তৃপক্ষ ভূমিকা ব্যবস্থাপনা",
"system_group_role_remove" => "বিভাগের ভূমিকা মুছে ফেলার জন্য ঠিক আছে",
"system_group_role_style" => "শৈলী",
"system_group_role_display" => "কিনা",
"system_group_role_display_desc" => "ডিফল্ট ব্যবহারকারীর অধিকার প্রদর্শন করা হবে কি না সেট করুন",
"role_type_name_read" => "পড়া",
"role_type_name_read:list" => "ফাইল তালিকা",
"role_type_name_read:info" => "ফাইল (ফোল্ডার) সম্পত্তি ভিউ, ফোল্ডার অনুসন্ধান",
"role_type_name_read:copy" => "ফাইল কপি",
"role_type_name_read:preview" => "ফাইলের পূর্বরূপ (ছবিগুলির, দস্তাবেজ, অডিও এবং ভিডিও)",
"role_type_name_read:download" => "ফাইল (ফোল্ডার) ডাউনলোড",
"role_type_name_write" => "লেখা",
"role_type_name_write:add" => "একটি ফাইল (ফোল্ডার) তৈরি করুন, কম্প্রেস ফাইল নিষ্কর্ষ",
"role_type_name_write:edit" => "ফাইল সংরক্ষণ করুন সম্পাদনা করতে",
"role_type_name_write:change" => ", পুনঃনামকরণ ডিরেক্টরি গঠন সমন্বয়",
"role_type_name_write:upload" => "ফাইল (ফোল্ডার) আপলোড, দূরবর্তী ডাউনলোড",
"role_type_name_write:remove" => "ফাইল (ফোল্ডার) মুছে দিন, কেটে",
"group_guest" => "দর্শকরা",
"group_guest_desc" => "আপনি বিভাগের সদস্য নন,<br/>শুধুমাত্র [বিভাগ ভাগ করা ডিরেক্টরীতে] নিম্নলিখিত সামগ্রীটি অ্যাক্সেস করতে পারেন, শুধুমাত্র-পঠনযোগ্য অনুমতিগুলি।",
"group_role_lebel_desc" => "আপনি এই বিভাগের সদস্য,<br/> বিভাগের মধ্যে সমস্ত নথি প্রশাসক দ্বারা সংরক্ষিত সমস্ত অধিকার",
"button_save_and_add" => "সংরক্ষণ করুন এবং যোগ করার জন্য অবিরত",
"path_cannot_search" => "ডিরেক্টরি অনুসন্ধান সমর্থন করে না!",
"not_support" => "সমর্থিত নয়!",
"group_not_exist" => "ব্যবহারকারী গ্রুপ অস্তিত্ব নেই!",
"upload_clear_all" => "সব পরিষ্কার",
"upload_clear" => "সমাপ্ত সাফ",
"upload_setting" => "সেট আপ করুন",
"upload_tips" => "ফালি আপলোড, আর php.ini সীমা সাপেক্ষে ব্যবহার করে; সুপারিশ ক্রোম ফোল্ডার ড্র্যাগ এবং ড্রপ আপলোড অভিজ্ঞতা",
"upload_exist" => "একই নামের ফাইল",
"upload_exist_rename" => "পুনঃনামকরণ",
"upload_exist_replace" => "আচ্ছাদন",
"upload_exist_skip" => "লাফালাফি করা",
"upload_add_more" => "বাল্ক অ্যাড",
"more" => "অধিক",
"system_setting" => "সিস্টেম সেটিংস",
"openProject" => "প্রকল্পের সম্পাদক খুলুন",
"url_download" => "ডাউনলোড",
"url_link" => "URL",
"app_type_link" => "শর্টকাট",
"createLink" => "শর্টকাট তৈরি করুন",
"createLinkHome" => "ডেস্কটপ শর্টকাট পাঠানো",
"createProject" => "সম্পাদক প্রকল্প যোগ করার পদ্ধতি",
"only_read" => "Read-only",
"only_read_desc" => "ডিরেক্টরি লেখার অনুমতি নেই<br/>আপনি সার্ভারে এই ডিরেক্টরির জন্য অনুমতি সেট করতে পারেন",
"not_read" => "অপাঠ্য",
"explorerNew" => "Kod লিংক",
"zip_download_ready" => "কম্প্রেশন স্বয়ংক্রিয়ভাবে ডাউনলোড হবে পরে, অনুগ্রহ করে অপেক্ষা করুন ...",
"set_background" => "যেমন ডেস্কটপ ওয়ালপেপার সেট করুন",
"share" => "ভাগ",
"my_share" => "আমার শেয়ার",
"group_share" => "বাহ্যিক অংশীদারী গ্রুপ",
"share_edit" => "শেয়ার সম্পাদনা করুন",
"share_remove" => "ভাগ করা বাতিল করুন",
"share_remove_tips" => "আপনি কি ভাগ করা বাতিল করার বিষয়ে নিশ্চিত? পাবলিক সংযোগ অবৈধ হবে।",
"share_path" => "পথ ভাগ করুন",
"share_title" => "সম্পদ শেয়ারিং",
"share_name" => "শিরোনাম শেয়ার করুন",
"share_time" => "শ্বাসত্যাগ",
"share_time_desc" => "নাল সেট না করা হয়",
"share_password" => "এক্সট্র্যাক্ট পাসওয়ার্ড",
"share_password_desc" => "খালি পাসওয়ার্ড সেট করা নেই",
"share_cancle" => "Unsharing",
"share_create" => "একটি পাবলিক লিঙ্ক তৈরি করুন",
"share_url" => "অংশীদারি ঠিকানার",
"share_not_download" => "ডাউনলোড নিষেধাজ্ঞা",
"share_not_download_tips" => "ভাগীদার ডাউনলোড নিষিদ্ধ!",
"share_code_read" => "কোড রিডার",
"share_save" => "কনফিগারেশন সংরক্ষণ করুন",
"share_error_param" => "পরামিতি ত্রুটি!",
"share_error_user" => "ব্যবহারকারীর তথ্য ত্রুটি!",
"share_error_sid" => "শেয়ার অস্তিত্ব নেই!",
"share_error_time" => "আপনি খুব দেরি, ভাগ মেয়াদপূর্তী আসা!",
"share_error_path" => "শেয়ারকৃত ফাইল উপস্থিত না থাকলে, তা মুছে ফেলা বা এটা মুছে ফেলা হবে!",
"share_error_password" => "ভুল পাসওয়ার্ড!",
"share_error_show_tips" => "এই ধরনের ফাইল প্রিভিউ সমর্থন করে না!",
"share_view_num" => "দেখা হয়েছে:",
"share_download_num" => "বিবরন",
"share_open_page" => "ভাগ পৃষ্ঠাটি খুলুন",
"open_the_path" => "ডিরেক্টরি লিখুন",
"recycle_clear" => "ট্র্যাশ খালি",
"recycle_clear_success" => "ট্র্যাশ খালি সাফল্য!",
"recycle_clear_info" => "আপনি কি নিশ্চিত যে আপনি সম্পূর্ণ খালি বাজে ইচ্ছুক?",
"fav_remove" => "বাতিল সংগ্রহ",
"remove_item" => "আইটেম",
"uploading" => "আপলোড",
"upload_tips_more" => "অনেকগুলি ফাইল, সংকুচিত আপলোড সুপারিশক্রমে, তারপর অনলাইন আনজিপ!",
"uploading_move" => "মার্জ স্থানান্তরে ...",
"show_file" => "নতুন পৃষ্ঠা পূর্বরূপ",
"unknow_file_title" => "ফাইল খোলা টিপ!",
"unknow_file_tips" => "এই ফাইলটি, আপনি পারবেন প্রয়োগের সমর্থন করে না চাইছেন:",
"unknow_file_try" => "চেষ্টা",
"unknow_file_download" => "ফাইল ডাউনলোড করুন",
"unknow_plugin_search" => "অনুসন্ধান-সম্পর্কিত অ্যাপ্লিকেশন ইনস্টল",
"config_save_error_auth" => "কনফিগারেশন সংরক্ষণ করতে ব্যর্থ, প্রশাসক এই বিশেষ সুযোগ নিষিদ্ধ!",
"config_save_error_file" => "ত্রুটি, ফাইল লেখা যাচ্ছে না!",
"beautify_code" => "কোড ফরম্যাটার",
"convert_case" => "কেস রূপান্তর",
"convert_upper_case" => "বড় হাতের অক্ষরে রূপান্তরিত",
"convert_lower_case" => "ছোট হাতের অক্ষরে রূপান্তরিত",
"editor_insert_time" => "বর্তমান সময় ",
"editor_md5" => " এমডি 5 এনক্রিপশন ",
"editor_qrcode" => " স্ট্রিং দ্বিমাত্রিক কোড ",
"editor_regx" => " নিয়মিত এক্সপ্রেশন টেস্টিং ",
"editor_chinese" => " সরলীকৃত রূপান্তর ",
"editor_chinese_simple" => " সরলীকৃত চীনা রূপান্তর ",
"editor_chinese_traditional" => " প্রথাগত চীনা রূপান্তর ",
"editor_base64" => "Base64 কোডেক ",
"editor_base64_encode" => " Base64 এনকোডিং ",
"editor_base64_decode" => " বেস64 ডিকোডিং ",
"editor_url" => " URL কোডেক ",
"editor_url_encode" => " URL এনকোডিং ",
"editor_url_decode" => " URL ডিকোডিং ",
"editor_unicode" => " ইউনিকোড কোডেক ",
"editor_unicode_encode" => " ইউনিকোড এনকোডিং ",
"editor_unicode_decode" => " ইউনিকোড ডিকোডিং",
"editor_tools_select_tips" => " আপনি রূপান্তর করতে চান কন্টেন্ট নির্বাচন করুন!",
"editor_calc" => "বিনামূল্যে ক্যালকুলেটর",
"shortcut" => "শর্টকাট",
"use_free" => "মুক্ত সংস্করণ ব্যবহার চালিয়ে যান",
"learn_more" => "আরও জানুন",
"replace" => "প্রতিস্থাপন করা",
"selectAll" => "নির্বাচন করা",
"reload" => "পুনরায় বোঝাই করা",
"about" => "উপর",
"complete_current" => "বর্তমান অটো-সমাপ্তি",
"view" => "দৃশ্য",
"tools" => "টুল",
"help" => "সাহায্য",
"not_exists" => "বর্তমানে নেই",
"group_role_fileDownload" => "ডাউনলোডগুলি",
"group_role_share" => "ভাগ",
"users_share" => "ভাগ করা",
"system_setting_save" => "নিরাপত্তা সেটিংস",
"system_setting_menu" => "মেনু ব্যবস্থাপনা",
"system_name" => "প্রোগ্রাম নাম",
"system_name_desc" => "প্রোগ্রাম লোগো শিরোনাম",
"system_desc" => "প্রোগ্রাম বর্ণনা",
"path_hidden" => "নির্দেশিকা বহিষ্কার",
"version_not_support" => "আপনার সংস্করণ এই সমর্থন করে না, দয়া করে উন্নত সংস্করণ কিনতে অফিসিয়াল ওয়েবসাইট থেকে যান!",
"version_not_support_number" => "সীমাবদ্ধতা সংখ্যা এই অপারেশন সমর্থন করে না যেমন, অফিসিয়াল ওয়েবসাইট এর উন্নত সংস্করণ কিনতে দয়া করে!",
"path_hidden_desc" => "ডিরেক্টরি এবং ফাইল ডিফল্টরূপে প্রদর্শিত না, কমা দ্বারা পৃথক",
"new_user_folder" => "নতুন ব্যবহারকারী ডিফল্ট ডিরেক্টরি করে নির্মিত হয়",
"new_user_folder_desc" => "কমা দ্বারা পৃথকীকৃত",
"new_user_app" => "নতুন ব্যবহারকারী ডিফল্ট অ্যাপ্লিকেশন দ্বারা নির্মিত হয়",
"new_user_app_desc" => "অ্যাপ্লিকেশন অ্যাপ্লিকেশন সেন্টার, কমা দ্বারা পৃথক একটি বহুবচন",
"auto_login" => "দর্শকরা স্বয়ংক্রিয় লগইন",
"auto_login_desc" => "ডিফল্ট লগইন ব্যবহারকারী<code>guest/guest</code>ব্যবহারকারীদের; খোলার পর তা নিশ্চিত করার জন্য ব্যবহারকারী বিদ্যমান",
"first_in" => "ডিফল্ট লগ-ইন করার পর",
"version_price_free" => "বিনামূল্যে",
"version_name_1" => "VIP 1",
"version_name_2" => "VIP 2",
"version_name_3" => "VIP 3",
"version_name_4" => "VIP 4",
"version_name_5" => "VIP 5",
"version_name_6" => "VIP 6",
"version_vip_free" => "Free",
"version_vip_1" => "VIP 1",
"version_vip_2" => "VIP 2",
"version_vip_3" => "VIP 3",
"version_vip_4" => "VIP 4",
"version_vip_5" => "VIP 5",
"version_vip_6" => "VIP 6",
"path_can_not_write_data" => "ডিরেক্টরি লিখনযোগ্য নয়, ডিরেক্টরি সেট এবং সমস্ত সাব-read-write পর আবার চেষ্টা করুন!",
"menu_name" => "মেনু নাম",
"menu_hidden" => "লুকান",
"menu_show" => "প্রদর্শন",
"menu_move_down" => "নিচে",
"menu_move_up" => "আপ",
"menu_move_del" => "মুছুন",
"menu_open_window" => "একটি নতুন উইন্ডোতে খুলুন",
"menu_sub_menu" => "সাবমেনু",
"url_path" => "URL ঠিকানা",
"url_path_desc" => "URL ঠিকানা বা JS কোড",
"no_permission_read" => "আপনি পড়ার অনুমতি আছে না!",
"no_permission_download" => "আপনি ডাউনলোড করার অনুমতি নেই!",
"php_env_check" => "অপারেটিং পরিবেশ পর্যবেক্ষণ:",
"php_env_error" => "Php লাইব্রেরি অনুপস্থিত",
"php_env_error_ignore" => "উপেক্ষা করুন এবং লিখুন",
"php_env_error_version" => "পিএইচপি সংস্করণ 5.0 কম হতে পারে না",
"php_env_error_path" => "লেখা যাচ্ছে না",
"php_env_error_list_dir" => "আপনার ওয়েব সার্ভারের মধ্যে নিরাপত্তার কারণে বৈশিষ্ট্য তালিকা প্রর্দশিত হবে, এই বৈশিষ্ট্যটি নিষ্ক্রিয়!<a href=\"https://www.google.com.hk/#newwindow=1&safe=strict&q=web+server+turn+off+directory+listing\" target=\"blank\">কিভাবে?</a>",
"php_env_error_gd" => "Php জিডি লাইব্রেরি খোলা, অন্যথায় কোড হতে হবে থাম্বনেইল ব্যবহার সঠিকভাবে কাজ করবে না",
"install_login" => "আপনি নিম্নলিখিত অ্যাকাউন্ট লগইন ব্যবহার করতে পারেন",
"install_enter" => "পদ্ধতি",
"install_user_default" => "অ্যাডমিনিস্ট্রেটর: {0} / (একটি পাসওয়ার্ড সেট নিচে) <br/> গড় ব্যবহারকারী: {1} <br/> অতিথি ব্যবহারকারী: {2}",
"login_root_password" => "অ্যাডমিনিস্ট্রেটর পাসওয়ার্ড সেট করুন",
"login_root_password_repeat" => "আবার পাসওয়ার্ড নিশ্চিত করুন",
"login_root_password_equal" => "পাসওয়ার্ড দুটি মিলছে না!",
"login_root_password_tips" => "একজন প্রশাসক পাসওয়ার্ড সেট করুন!",
"forget_password" => "আপনার পাসওয়ার্ড ভুলে গেছেন",
"forget_password_tips" => "অ্যাডমিনিস্ট্রেটরের পাসওয়ার্ড ভুলে গেছেন: <br/> সার্ভার লগ ইন করুন রিসেট <b>./data/system/install.lock</b> মুছে ফেলা; <br/><br/> অ প্রশাসক পাসওয়ার্ড ভুলে গেছেন: <br/> রিসেট করতে প্রশাসকের সাথে যোগাযোগ করুন!",
"copyright_desc" => "Kodexplorer একটি অত্যন্ত প্রশংসিত ওয়েব ডকুমেন্ট ম্যানেজমেন্ট সিস্টেম, আপনি এমনকি webIDE সরাসরি অনলাইনে উন্নয়ন, অভ্যন্তরীণ নথি ব্যবস্থাপনা বা ভাগ, এছাড়াও সাইট ম্যানেজমেন্ট সার্ভার ব্যবহার করা যায় জন্য এটি ব্যবহার, FTP প্রতিস্থাপন করতে পারেন. এছাড়াও আপনি দ্বিতীয় উন্নয়ন প্রোগ্রাম আপনার বিদ্যমান সিস্টেমের মধ্যে এই সংহত করতে পারেন.",
"copyright_contact" => "Contact us:kodcloud@qq.com <a>.</a> <a href=\"javascript:core.openWindow('http://bbs.kodcloud.com/');\">Feedback</a>",
"copyright_info" => "Copyright © <a href=\"https://kodcloud.com/?kodref=%s\" target=\"_blank\">kodcloud.com</a>.",
"copyright_pre" => "Powered by KodExplorer",
"kod_name" => "KodExplorer",
"kod_name_desc" => "আম মেঘ • এক্সপ্লোরার",
"kod_power_by" => " - Powered by KodExplorer",
"kod_name_copyright" => "আম মেঘ • এক্সপ্লোরার",
"kod_meta_name" => "KodExplorer",
"kod_meta_keywords" => "KodExplorer, Kod, kodCloud, webOS, webIDE, পিএইচপি filemanage, filemanage, দাও মেঘ, মেঘ আম, ডকুমেন্ট ম্যানেজমেন্ট সিস্টেম, এন্টারপ্রাইজ মেঘ ডিস্ক, অনুসন্ধানকারী ,, অনলাইন ডকুমেন্টেশন, অনলাইন কার্যালয়, অনলাইন অফিস, অনলাইন কানাডিয়ান প্রিভিউ, অনলাইন সম্পাদনা , অনলাইন সম্পাদক",
"kod_meta_description" => "KodExplorer রোড মেঘ পারেন (পূর্বে আম মেঘ) নিরাপদ এবং নিয়ন্ত্রণ সহজ এবং সহজ প্রদান সরকার / কর্পোরেট ব্যক্তিগত মেঘ এবং ব্যক্তিগত ওয়েবসাইটের জন্য অনলাইন দস্তাবেজে ম্যানেজমেন্ট সিস্টেম, এন্টারপ্রাইজ বেসরকারী মেঘ স্থাপনার, নেটওয়ার্ক স্টোরেজ, অনলাইন দস্তাবেজে ব্যবস্থাপনা একটি নেতৃস্থানীয় প্রদানকারী, অনলাইন অফিস ব্যবহার, অত্যন্ত ব্যক্তিগত মেঘ পণ্য কাস্টমাইজড। Cai ইয়ং জানালা শৈলী ইন্টারফেস, অপারেটিং চর্চা, দ্রুত শুরু করতে খাপ খাওয়ানো না করেও, অনলাইন প্রিভিউ, প্লেব্যাক এবং সম্পাদনা পরিবেশ বান্ধব, শক্তিশালী সাধারণ ফাইল ফরম্যাট প্রজাতির শত শত সমর্থন একটি ট্রায়াল, তারা আর ব্যক্তিগত ছাড়া কি হয় মেঘ অর্ঘ।",
"kod_meta_copyright" => "kodcloud.com",
"login" => "লগইন করুন",
"guest_login" => "অতিথি সাইন ইন",
"username" => "লগইন অ্যাকাউন্ট",
"userNickName" => "ব্যবহারকারীর ডাক নাম",
"password" => "পাসওয়ার্ড",
"login_code" => "সঙ্কেত",
"need_check_code" => "লগইন প্রমাণীকরণ কোডটি উন্মুক্ত",
"need_check_code_desc" => "লগ ইন করার পরে, আপনাকে যাচাইকরণ কোডটি অবশ্যই প্রবেশ করতে হবে।",
"setting_csrf_protect" => "ওপেন csrf সুরক্ষা",
"setting_csrf_protect_desc" => "হামলা কার্যকরভাবে csrf রক্ষা করতে পারে খোলার টাইপ করার পর",
"login_rember_password" => "পাসওয়ার্ড মনে রেখো",
"setting_show_root_group" => "সব বিভাগ তালিকা",
"setting_show_root_group_desc" => "সব বিভাগ তালিকাভুক্ত কিনা ট্রি নির্দেশক মূল বিভাগ",
"setting_show_share_user" => "সকল ব্যবহারকারীর একটি তালিকা",
"setting_show_share_user_desc" => "বৃক্ষ ডিরেক্টরি রুট বিভাগ সমস্ত ব্যবহারকারী ভাগ জন্য তালিকাভুক্ত করা হয়",
"setting_clear_user_recycle" => "সকল ব্যবহারকারীর জন্য রিসাইকেল বিন খালি",
"setting_clear_cache" => "ক্যাশে খালি করুন",
"setting_icp" => "কপিরাইট বা রেকর্ড সংখ্যা",
"setting_global_css" => "কাস্টম বিশ্বব্যাপী CSS",
"setting_global_css_desc" => "সমস্ত পৃষ্ঠা কাস্টম CSS ঢোকাব",
"setting_global_html" => "পরিসংখ্যানগত কোড এইচটিএমএল",
"setting_global_html_desc" => "সমস্ত পৃষ্ঠা এই অনুচ্ছেদ HTML কোড সন্নিবেশ করানো হবে, কোড তৃতীয় পক্ষের পরিসংখ্যান স্থাপন করা যেতে পারে",
"us" => "kodcloud.com",
"login_not_null" => "ব্যবহারকারী নাম এবং পাসওয়ার্ড খালি হতে পারে না!",
"code_error" => "ত্রুটি কোডের",
"password_error" => "ব্যবহারকারীর নাম বা পাসওয়ার্ড ভুল!",
"password_not_null" => "পাসওয়ার্ড খালি হতে পারে না!",
"old_password_error" => "পুরানো পাসওয়ার্ড ভুল!",
"permission" => "অনুমতি!",
"permission_edit" => "অনুমতি সংশোধন",
"file_info_owner" => "মালিক",
"file_info_group" => "গ্রুপ",
"no_permission" => "অ্যাডমিনিস্ট্রেটর এই বিশেষ সুযোগ অক্ষম করেছে!",
"no_permission_ext" => "অ্যাডমিনিস্ট্রেটর ফাইল অনুমতি এই ধরনের নিষিদ্ধ",
"dialog_max" => "চরমে তোলা",
"dialog_min" => "কমান",
"dialog_min_all" => "সমস্ত মিনিমাইজ",
"dialog_display_all" => "সব উইন্ডোসমূহ দেখাবে",
"dialog_close_all" => "সব বন্ধ",
"open" => "খোলা",
"others" => "অন্যান্য",
"open_with" => "এর জন্য খুলুন ...",
"close" => "ঘনিষ্ঠ",
"close_all" => "সব বন্ধ",
"close_left" => "বাম ট্যাবটি বন্ধ",
"close_right" => "ডানদিকের ট্যাবস বন্ধ করুন",
"close_others" => "বন্ধ অন্যান্য",
"loading" => "অপারেশন ...",
"warning" => "সতর্কতা",
"getting" => "পান ...",
"sending" => "ডেটা ট্রান্সমিশন ...",
"data_error" => "ডেটা ত্রুটি!",
"get_success" => "সাফল্য পান!",
"save_success" => "সফলভাবে সংরক্ষিত!",
"success" => "সফল অপারেশন",
"error" => "অপারেশন ব্যর্থ",
"error_repeat" => "অপারেশন ব্যর্থ, নাম আগে থেকেই আছে!",
"word_error" => "ব্যর্থতা ",
"word_success" => " সাফল্য",
"system_error" => "সিস্টেম ত্রুটি",
"name" => "নাম",
"type" => "আদর্শ",
"contain" => "ধারণ করা",
"address" => "অবস্থান",
"size" => "আয়তন",
"byte" => "সংবাদের একক",
"path" => "পথ",
"action" => "অপারেটিং",
"create_time" => "নির্মিত",
"modify_time" => "পরিমিত",
"last_time" => "সর্বশেষ ভিজিট",
"sort_type" => "সাজানোর ক্রম",
"time_type" => "Y/m/d H:i:s",
"time_type_info" => "Y/m/d H:i:s",
"public_path" => "জন ডিরেক্টরি",
"system_path_not_change" => "সিস্টেম তালিকা, পরিবর্তন করা যাবে না",
"file" => "ফাইল",
"folder" => "ফোল্ডার",
"copy" => "কপি",
"past" => "লাঠি",
"clone" => "একটি অনুলিপি তৈরি করুন",
"cute" => "কাটা",
"cute_to" => "যান ...",
"copy_to" => "অনুলিপি করুন ...",
"remove" => "মুছুন",
"remove_force" => "কমপ্লিটলি অপসারণ",
"info" => "সম্পত্তি",
"list_type" => "দৃশ্য",
"list_icon" => "আইকন অ্যারে",
"list_list" => "তালিকা বিন্যাস",
"list_list_split" => "কলাম মোড",
"sort_up" => "বৃদ্ধি",
"sort_down" => "কমছে",
"order_type" => "সাজানোর ক্রম",
"order_desc" => "নিম্নক্রম",
"order_asc" => "ঊর্ধ্বগামী",
"rename" => "পুনঃনামকরণ",
"add_to_fav" => "পছন্দসই যোগ করুন",
"search_in_path" => "ফোল্ডার খোঁজা",
"add_to_play" => "প্লেতালিকায় জুড়ুন",
"manage_fav" => "প্রিয়গুলি পরিচালনা করুন",
"refresh_tree" => "সুদ্ধ করুন ডিরেক্টরি ট্রি",
"manage_folder" => "নির্দেশিকা ম্যানেজমেন্ট",
"close_menu" => "মেন্যু",
"zip" => "একটি সংকুচিত প্যাকেজ তৈরি করুন",
"unzip" => "বের করে আনতে ...",
"unzip_folder" => "একটি ফোল্ডারে আনজিপ করুন",
"unzip_this" => "বর্তমান এক্সট্র্যাক্ট",
"unzip_to" => "বের করে আনতে ...",
"zipview_file_big" => "ফাইল অত্যন্ত বড়, এবং তারপর পূর্বরূপ অপারেশন নিষ্কর্ষ!",
"clipboard" => "দেখুন ক্লিপবোর্ড",
"clipboard_clear" => "খালি ক্লিপবোর্ড",
"full_screen" => "ফুল স্ক্রীণ মোড থেকে",
"folder_info_item" => "আইটেম",
"folder_info_item_select" => "নির্বাচিত",
"file_load_all" => "সব লোড করতে ডাবল ক্লিক করুন ......",
"tips" => "প্রম্পট",
"ziping" => "জিপ করা হচ্ছে ...",
"unziping" => "বের করা হচ্ছে ...",
"moving" => "মোবাইল অপারেশন ...",
"remove_title" => "নিশ্চিতকরণ মুছুন",
"remove_info" => "নির্বাচিত আইটেমের মুছে ফেলার জন্য Confirm?",
"remove_title_force" => "স্থায়ীভাবে মুছে ফেলা",
"remove_info_force" => "আপনি কি নিশ্চিত যে আপনি স্থায়ীভাবে এই ডকুমেন্ট মুছে ফেলতে চান?",
"name_isexists" => "ভুল, নাম আগে থেকেই আছে!",
"install" => "ইনস্টল করুন",
"width" => "প্রস্থ",
"height" => "উচ্চ",
"app" => "হাল্কা অ্যাপ্লিকেশন",
"app_store" => "হাল্কা অ্যাপ্লিকেশন",
"app_create" => "অ্যাপ্লিকেশন তৈরি করুন",
"app_edit" => "আবেদন পরিবর্তন করুন",
"app_group_all" => "সম্পূর্ণ",
"app_group_game" => "খেলা",
"app_group_tools" => "টুল",
"app_group_reader" => "পড়া",
"app_group_movie" => "টিভি",
"app_group_music" => "সঙ্গীত",
"app_group_life" => "জীবন",
"app_group_others" => "অন্যান্য",
"app_desc" => "বিবরণ",
"app_icon" => "অ্যাপ্লিকেশন আইকন",
"app_icon_show" => "URL ঠিকানা অথবা ডাইরেক্টরি",
"app_group" => "আবেদন প্যাকেট",
"app_type" => "আদর্শ",
"app_type_url" => "লিংক",
"app_type_code" => "JS এক্সটেনশন",
"app_display" => "বহি",
"app_display_border" => "সীমানা না থাকলে (অর্থাৎ বর্ডারলেস নির্বাচন করুন)",
"app_display_size" => "(সমন্বয় পরীক্ষা করুন) মাপ পরিবর্তন",
"app_size" => "আয়তন",
"app_url" => "লিংক ঠিকানা",
"app_code" => "JS কোড",
"edit" => "সম্পাদন করা",
"edit_can_not" => "না একটি টেক্সট ফাইল",
"edit_too_big" => "ফাইলটি অতি দীর্ঘ, এটা 40M তার চেয়ে অনেক বেশী হতে পারে না",
"open_default" => "ডিফল্ট ওপেন",
"open_ie" => "ব্রাউজার ওপেন",
"refresh" => "সতেজ করা",
"refresh_all" => "নবায়ন",
"newfile" => "নতুন ফাইল",
"newfile_save_as" => "সংরক্ষণ করুন",
"newfolder" => "নতুন ফোল্ডার",
"newothers" => "নিউ অন্যান্য",
"path_loading" => "লোড হচ্ছে ...",
"go" => "হাঁটুন!",
"go_up" => "উচ্চ স্তর",
"history_next" => "অগ্রবর্তী",
"history_back" => "পশ্চাদপসরণ",
"address_in_edit" => "সম্পাদনা মোডে প্রবেশ করার জন্য ক্লিক করুন",
"double_click_rename" => "পুনঃনামকরনের ডাবল ক্লিক করুন",
"double_click_open" => "খোলার জন্য ডাবল ক্লিক করুন",
"path_null" => "ফোল্ডার খালি!",
"file_size_title" => "আইকন সাইজ",
"file_size_small_super" => "আল্ট্রা-ছোট",
"file_size_small" => "ছোট আইকন",
"file_size_default" => "আইকন",
"file_size_big" => "বড় আইকন",
"file_size_big_super" => "বড় আইকন",
"upload" => "আপলোড",
"upload_ready" => "আপলোড করার জন্য অপেক্ষা করা হচ্ছে",
"upload_success" => "আপলোড সফল",
"upload_path_current" => "বর্তমান ডিরেক্টরির পাল্টান",
"upload_select" => "ফাইল নির্বাচন করুন",
"upload_max_size" => "সর্বোচ্চ অনুমোদিত",
"upload_size_info" => "আপনি আরো কনফিগার করতে চান তাহলে, php.ini সর্বোচ্চ অনুমোদিত আপলোড সংশোধন দয়া করে. যখন আপনি নির্বাচন একটি ফাইল এই কনফিগারেশন চেয়ে বড় স্বয়ংক্রিয়ভাবে ফিল্টার আউট হবে.",
"upload_error" => "আপলোড ব্যর্থ",
"upload_error_http" => "নেটওয়ার্ক বা ফায়ারওয়াল ত্রুটি",
"upload_muti" => "মাল্টি ফাইল আপলোড",
"upload_drag" => "টেনে আনুন এবং ড্রপ আপলোড",
"upload_drag_tips" => "আপলোড করার জন্য আলগা!",
"path_not_allow" => "ফাইল নাম দেওয়া যাবে না",
"download" => "ডাউনলোড",
"downloading" => "লোড হচ্ছে ...",
"download_address" => "ডাউনলোড",
"download_ready" => "ডাউনলোড করা হবে",
"download_success" => "ডাউনলোড সাফল্য!",
"download_error" => "ডাউনলোড ব্যর্থ হয়েছে!",
"download_error_create" => "লেখার ত্রুটি!",
"download_error_exists" => "লিংক ব্যর্থ দায়ের করা!",
"upload_error_null" => "কোন ফাইল!",
"upload_error_big" => "ফাইলের আকার সার্ভার সীমা ছাড়িয়ে গেছে",
"upload_error_move" => "ফাইল স্থানান্তর করতে ব্যর্থ হয়েছে!",
"upload_error_exists" => "ফাইল আগে থেকেই আছে",
"upload_local" => "স্থানীয় আপলোড",
"download_from_server" => "রিমোট ডাউনলোড",
"save_path" => "পাথ সংরক্ষণ",
"upload_select_muti" => "নির্বাচনযোগ্য ফাইল আপলোড একটি বহুবচন",
"search" => "অনুসন্ধান",
"searching" => "অনুসন্ধান করা হচ্ছে ...",
"search_result" => "অনুসন্ধান ফলাফল",
"seach_result_too_more" => "অনেকগুলি অনুসন্ধান ফলাফল, এটি একটি ডিরেক্টরি বা শব্দের জন্য সুপারিশ করা হয়",
"search_null" => "কোন ফলাফল নেই!",
"search_uplow" => "কেস সংবেদনশীল",
"search_content" => "অনুসন্ধান ফাইলের বিষয়বস্তু",
"search_info" => "একটি অনুসন্ধান শব্দ লিখুন এবং অনুসন্ধান পাথ দয়া করে!",
"search_ext_tips" => "দ্বারা | আলাদা; উদাহরণ পিএইচপি জন্য | JS | CSS<br/>ডিফল্ট টেক্সট ফাইল সার্চ না কি পূর্ণ হয়ে গেছ",
"file_type" => "ফাইল টাইপ",
"goto" => "ঝাঁপ দাও",
"server_dwonload_desc" => "টাস্ক ডাউনলোড লিস্টে যোগ করা হয়েছিল",
"parent_permission" => "পেরেন্ট ডাইরেক্টরি অনুমতি",
"root_path" => "আমার নথি",
"lib" => "আড়ত",
"fav" => "বুকমার্ক করুন",
"desktop" => "ডেস্কটপ",
"browser" => "ব্রাউজার",
"my_computer" => "আমার কম্পিউটার",
"recycle" => "আবর্জনা",
"my_document" => "আমার নথি",
"my_picture" => "আমার ফটো",
"my_music" => "আমার গান",
"my_movie" => "আমার ভিডিওসমূহ",
"my_download" => "আমার ডাউনলোডগুলি",
"ui_desktop" => "ডেস্কটপ",
"ui_explorer" => "ফাইল ম্যানেজমেন্ট",
"ui_editor" => "সম্পাদক",
"adminer" => "adminer",
"ui_project_home" => "প্রকল্প হোম",
"ui_login" => "লগইন করুন",
"ui_logout" => "অব্যাহতিপ্রাপ্ত",
"setting" => "সিস্টেম সেটিংস",
"setting_title" => "বিকল্প",
"setting_user" => "ব্যক্তিগত কেন্দ্র",
"setting_password" => "পাসওয়ার্ড পরিবর্তন করুন",
"setting_password_old" => "পুরনো পাসওয়ার্ড",
"setting_password_new" => "সংশোধিত",
"setting_language" => "ভাষা সেটিংস",
"setting_member" => "ইউজার ম্যানেজমেন্ট",
"setting_group" => "ব্যবহারকারী গ্রুপ ব্যবস্থাপনা",
"setting_group_add" => "ব্যবহারকারী গোষ্ঠী যোগ",
"setting_group_edit" => "সম্পাদনা ইউজার গ্রুপ",
"setting_theme" => "থিম সেটিংস",
"setting_wall" => "ওয়ালপেপার সেটিংস",
"setting_wall_desktop" => "ডেস্কটপ ওয়ালপেপার",
"setting_wall_desktop_list" => "ডেস্কটপ ওয়ালপেপার ম্যানেজমেন্ট",
"setting_wall_login_list" => "লগইন ওয়ালপেপার ম্যানেজমেন্ট",
"setting_wall_login_tips" => "টিপ: যখন একাধিক অংশ থাকে, তখন লগইন ইন্টারফেসের পটভূমি এলোমেলোভাবে ঘোরানো হবে",
"setting_wall_diy" => "কাস্টম ওয়ালপেপার:",
"setting_wall_info" => "চিত্র URL ঠিকানা, স্থানীয় ছবি ইমেজ খুলতে ব্রাউজার পেতে অধিকার হতে পারে",
"setting_fav" => "বুকমার্ক পরিচালক",
"setting_help" => "সাহায্য ব্যবহার",
"setting_about" => "কাজ সম্পর্কে",
"setting_success" => "সংশোধন প্রভাব গ্রহণ করেছে!",
"can_not_repeat" => "পুনরাবৃত্তি করার অনুমতি দেওয়া হয়নি",
"absolute_path" => "পরম ঠিকানা",
"group" => "ইউজার গ্রুপ",
"data_not_full" => "ডেটা অসম্পূর্ণ জমা দেওয়া হয়নি!",
"default_user_can_not_do" => "ডিফল্ট ব্যবহারকারী কাজ করতে পারে না",
"default_group_can_not_do" => "ডিফল্ট ব্যবহারকারী গ্রুপ কাজ করতে পারে না",
"username_can_not_null" => "ব্যবহারকারীর নাম খালি হতে পারে না!",
"groupname_can_not_null" => "ব্যবহারকারী গ্রুপের নাম খালি হতে পারে না!",
"groupdesc_can_not_null" => "ব্যবহারকারী গোষ্ঠী বর্ণনা খালি হতে পারে না!",
"group_move_user_error" => "ব্যবহারকারী গোষ্ঠী ব্যবহারকারীরা ব্যর্থ মুভ",
"group_already_remove" => "ব্যবহারকারী গ্রুপ মুছে ফেলা হয়েছে",
"group_not_exists" => "এই ব্যবহারকারী গ্রুপ অস্তিত্ব নেই",
"member_add" => "ব্যবহারকারী যুক্ত করুন",
"password_null_not_update" => "তারা বলেন, তারা পরিবর্তন করা হয়নি পাসওয়ার্ড পূরণ না হয়",
"if_save_file_tips" => "কিছু ফাইল সংরক্ষিত হয় না। আপনি উইন্ডোটি বন্ধ করার ব্যাপারে নিশ্চিত?",
"if_save_file" => "ফাইল সংরক্ষণ করা হয়নি, আপনি সংরক্ষণ করতে চান?",
"if_remove" => "মুছুন নিশ্চিত",
"member_remove_tips" => "আপনি ব্যবহারকারী ডিরেক্টরি সাফ করা যাবে সরানোর পরে",
"group_remove_tips" => "আপনি ব্যবহারকারীদের ব্যবহারকারী গ্রুপ লগইন করতে পারবেন না সরানোর পরে<br/>(প্রয়োজন পুনরায় সেট ব্যবহারকারী গ্রুপ)",
"group_name" => "ব্যবহারকারী গ্রুপের নাম",
"group_name_tips" => "সুপারিশ ইংরেজি নাম, পুনরাবৃত্তি করা যাবে না",
"group_desc" => "প্রদর্শন নাম",
"group_desc_tips" => "গ্রুপের নাম বর্ণনা",
"group_role_ext" => "এক্সটেনশন বিধিনিষেধ",
"group_role_ext_tips" => "একাধিক সঙ্গে | বিচ্ছিন্ন",
"group_role_file" => "ফাইল ম্যানেজমেন্ট",
"group_role_upload" => "আপলোড করার অনুমতি দিন",
"group_role_user" => "ব্যবহারকারী তথ্য",
"group_role_group" => "ব্যবহারকারী গ্রুপ ব্যবস্থাপনা",
"group_role_member" => "ইউজার ম্যানেজমেন্ট",
"group_role_mkfile" => "নতুন ফাইল",
"group_role_mkdir" => "নতুন ফোল্ডার",
"group_role_pathrname" => "পুনঃনামকরণ",
"group_role_pathdelete" => "ফাইল মুছে ফেলার",
"group_role_pathinfo" => "ফাইল বৈশিষ্ট্যাবলী",
"group_role_pathmove" => "সরান (কপি / কাট / পেস্ট / ড্র্যাগ অপারেশন)",
"group_role_zip" => "সংকোচন",
"group_role_unzip" => "আনজিপ",
"group_role_search" => "অনুসন্ধান",
"group_role_filesave" => "ফাইল সংরক্ষণ সম্পাদনা করতে",
"group_role_can_upload" => "আপলোড ও ডাউনলোডের",
"group_role_download" => "রিমোট ডাউনলোড",
"group_role_passowrd" => "পাসওয়ার্ড পরিবর্তন করুন",
"group_role_config" => "কনফিগারেশন তথ্য",
"group_role_fav" => "বুকমার্ক কার্যকলাপ (যোগ / সম্পাদনা / মোছা)",
"action_list" => "তালিকা দেখুন",
"action_add" => "যোগ",
"action_edit" => "সম্পাদন করা",
"action_del" => "মুছুন",
"group_role_ext_warning" => "<br/>পুনঃনামকরণ (নির্দিষ্ট এক্সটেনশন পালটে),<br/>রক্ষা পরিবর্তনপারবেন, দূরবর্তী ডাউনলোড, নির্যাস এই ধরনের ফাইলের অনুমতি না আপলোড",
"group_tips" => "<li> 1. ইউজার গ্রুপের নামটি অনুলিপি করা যাবে না। গোষ্ঠীর নাম পরিবর্তন করার পরে, এটি পুনর্বিন্যাসিত ব্যবহারকারীর অন্তর্গত এবং স্বয়ংক্রিয়ভাবে যুক্ত করা হবে। </li><li> 2. এক্সটেনশানগুলি সিস্টেমের নিরাপত্তার মধ্যে সম্পর্ক সীমাবদ্ধ করুন, সাবধানে থাকুন <i>(যদি আপনি ওয়েব ডাইরেক্টরিতে একটি নতুন পিএইচপি তৈরি করেন তবে এর অর্থ হল এই ব্যবহারকারীর প্রোগ্রামের অনুমতিগুলি পরিবর্তন করা অসম্ভব)</i> </li><li> 3. পারিবারিক ব্যবস্থাপনা, অধিকার গোষ্ঠী ব্যবস্থাপনা; অধিকার দেখুন এবং যোগ, মুছে ফেলা, এবং অধিকার সংশোধন করা; প্রোগ্রাম স্বয়ংক্রিয়ভাবে যুক্ত করা হয় </li><li> 4. অনুমতি গোষ্ঠী অনুমতি গ্রুপ যোগ করার জন্য সেট করা হয় পর, পরবর্তী অনুমতি উত্তরাধিকারসূত্রে প্রাপ্ত হয় না <i>(এই অনুমতি সর্বোচ্চ অনুমতি সমতুল্য)।</i> </li>",
"not_null" => "প্রয়োজনীয় ক্ষেত্রগুলি খালি হতে পারে না!",
"picture_can_not_null" => "ফটো খালি হতে পারে না!",
"rname_success" => "সাফল্য পুনঃনামকরণ!",
"please_inpute_search_words" => "অনুসন্ধান করার জন্য একটি পংক্তি লিখুন দয়া করে",
"remove_success" => "সফলভাবে মোছা হয়েছে!",
"remove_fali" => "মুছুন ব্যর্থ হয়েছে!",
"clipboard_null" => "ক্লিপবোর্ড খালি!",
"create_success" => "নতুন সাফল্য!",
"create_error" => "নিউ ব্যর্থ, চেক ডিরেক্টরি ব্যবহারের অনুমতি!",
"copy_success" => "[কপি] - ক্লিপবোর্ড সাফল্য আচ্ছাদন!",
"cute_success" => "[কেটে] - ক্লিপবোর্ড সাফল্য আচ্ছাদন!",
"clipboard_state" => "ক্লিপবোর্ড অবস্থা:",
"no_permission_write_all" => "ফাইল বা ডিরেক্টরির লিখনযোগ্য নয়",
"no_permission_write_file" => "ফাইল লেখার অনুমতি নেই",
"no_permission_read_all" => "ফাইল বা ডিরেক্টরির কোন পঠিত অনুমতি রয়েছে",
"copy_not_exists" => "উত্স অস্তিত্ব নেই",
"current_has_parent" => "লক্ষ্য ফোল্ডারের উৎস ফোল্ডার এর একটি খোলা হয়!",
"past_success" => "<b>পেস্ট অপারেশন সম্পন্ন হয়</b>",
"cute_past_success" => "<b>কাটা অপারেশন সম্পন্ন হয়</b>(সোর্স ফাইল মুছে ফেলা হয়, ক্লিপবোর্ড খালি)",
"zip_success" => "কম্প্রেশন সম্পন্ন",
"not_zip" => "সংরক্ষণাগার না",
"zip_null" => "নির্বাচিত ফাইল বা ডিরেক্টরির",
"unzip_success" => "আনজিপ সম্পূর্ণ",
"gotoline" => "লাইন ঝাঁপ দাও",
"path_is_current" => "পাথ এবং বর্তমান পাথ একই খুলতে!",
"path_exists" => "নাম আগে থেকেই আছে!",
"undo" => "প্রত্যাহার",
"redo" => "এন্টি প্রত্যাহার",
"preview" => "প্রি",
"wordwrap" => "মোড়ানো",
"show_gutter" => "রেখার নম্বর দেখান",
"char_all_display" => "অদৃশ্য অক্ষর প্রদর্শন করা হবে",
"auto_complete" => "স্বয়ংক্রিয়ভাবে অনুরোধ জানানো হবে",
"auto_save" => "স্বয়ংক্রিয়ভাবে সংরক্ষণ করুন",
"function_list" => "ফাংশন তালিকা",
"code_theme" => "কোডিং স্টাইল",
"font_size" => "ফন্ট সাইজ",
"confirm" => "আপনি কি নিশ্চিত যে আপনি এটি করতে চান?",
"button_ok" => "নির্ধারণ",
"button_submit" => "জমা দিন",
"button_set" => "সেট আপ করুন",
"button_cancel" => "বাতিল করা হয়েছে",
"button_edit" => "সম্পাদন করা",
"button_save" => "সংরক্ষণ করুন",
"button_apply" => "প্রয়োগ করা",
"button_save_all" => "সকল সংরক্ষণ",
"button_not_save" => "সংরক্ষণ করা হবে না",
"button_add" => "যোগ",
"button_back_add" => "যোগ ফিরুন",
"button_del" => "মুছুন",
"button_save_edit" => "পরিবর্তনগুলি সংরক্ষণ",
"button_save_submit" => "সংরক্ষণ করুন",
"button_more" => "অধিক",
"button_select_all" => "নির্বাচন সকল / নিষ্ক্রিয় করো",
"charset_AUTO" => "স্বয়ংক্রিয় সনাক্তকরণ",
"charset_UTF_8" => "Unicode",
"charset_UTF_16" => "Unicode",
"charset_CP1256" => "আরবি",
"charset_ISO_8859_6" => "আরবি",
"charset_ISO_8859_10" => "নরডিক ভাষায়",
"charset_CP1257" => "বাল্টিক ভাষা",
"charset_ISO_8859_13" => "বাল্টিক ভাষা",
"charset_ISO_8859_4" => "বাল্টিক ভাষা",
"charset_BIG5_HKSCS" => "繁体-香港",
"charset_BIG5" => "繁体-台湾",
"charset_Georgian_Academy" => "জর্জিয়ান",
"charset_PT154" => "কাজাখ",
"charset_CP949" => "কোরিয়ান",
"charset_EUC_KR" => "কোরিয়ান",
"charset_GB18030" => "সরলীকৃত চীনা",
"charset_GBK" => "সরলীকৃত চীনা",
"charset_ISO_8859_14" => "কেল্ট্ জাতির ভাষা",
"charset_CP1133" => "লাও",
"charset_ISO_8859_16" => "রোমানিয়ন",
"charset_ISO_8859_3" => "দক্ষিণ ইউরোপীয়",
"charset_EUC_JP" => "জাপানি",
"charset_ISO_2022_JP" => "জাপানি",
"charset_SHIFT_JIS" => "জাপানি",
"charset_KOI8_T" => "তাজিক ভাষা",
"charset_ISO_8859_11" => "থাই",
"charset_TIS_620" => "থাই",
"charset_CP1254" => "তুর্কী",
"charset_CP1251" => "সিরিলিক",
"charset_ISO_8859_5" => "সিরিলিক",
"charset_KOI8_R" => "সিরিলিক",
"charset_KOI8_U" => "সিরিলিক",
"charset_CP1252" => "পশ্চিম ইউরোপীয় ভাষা",
"charset_ISO_8859_1" => "পশ্চিম ইউরোপীয় ভাষা",
"charset_ISO_8859_15" => "পশ্চিম ইউরোপীয় ভাষা",
"charset_Macintosh" => "পশ্চিম ইউরোপীয় ভাষা",
"charset_CP1255" => "হিব্রু",
"charset_ISO_8859_8" => "হিব্রু",
"charset_CP1253" => "গ্রিক",
"charset_ISO_8859_7" => "গ্রিক",
"charset_ARMSCII_8" => "আর্মেনিয়",
"charset_CP1258" => "ভিয়েতনামী",
"charset_VISCII" => "ভিয়েতনামী",
"charset_CP1250" => "মধ্য ইউরোপীয় ভাষাসমূহ",
"charset_ISO_8859_2" => "মধ্য ইউরোপীয় ভাষাসমূহ",
"charset_default_set" => "ফাইল এনকোডিং",
"charset_convert_save" => "যেমন এনকোড ফাইল সংরক্ষণ করুন",
"PluginCenter" => "প্লাগ কেন্দ্র",
"PluginBuy" => "ক্রয় অনুমোদন",
"PluginInstalled" => "ইনস্টল করা হয়েছে",
"PluginUpdate" => "আপডেট",
"PluginListNull" => "সেখানে কোনো বিষয়বস্তু নেই!",
"PluginType" => "শ্রেণীবিন্যাস",
"PluginTypeAll" => "সম্পূর্ণ",
"PluginTypeFile" => "বর্ধিত ফাইল",
"PluginTypeSafe" => "সিকিউরিটি টুলস",
"PluginTypeTools" => "উপযোগ",
"PluginTypeMedia" => "মাল্টিমিডিয়া",
"PluginTypeOthers" => "অন্যান্য",
"PluginInstall" => "প্লাগ ইনস্টল করুন",
"PluginEnable" => "প্লাগ-ইন সক্ষম করুন",
"PluginDisable" => "অক্ষম",
"PluginRemove" => "প্লাগ আনইনস্টল",
"PluginConfig" => "প্লাগ-ইন কনফিগার করুন",
"PluginStatus" => "রাষ্ট্র",
"PluginStatusEnabled" => "সক্ষম করা",
"PluginStatusDisabled" => "সক্ষম করা",
"PluginStatusNotInstall" => "ইনস্টল করা নেই",
"PluginInstalling" => "ইনস্টলেশনের ...",
"PluginHasUpdate" => "আপডেট",
"PluginUpdateStart" => "প্ল্যাগ-ইন আপডেট",
"PluginNeedConfig" => "প্রারম্ভিক কনফিগারেশন সক্রিয় করতে হবে",
"PluginConfigNotNull" => "প্রয়োজনীয় ক্ষেত্রগুলি খালি রাখা যাবে না!",
"PluginOpen" => "খোলা",
"PluginAuther" => "লেখক",
"PluginVersion" => "সংস্করণ",
"PluginDownloadNumber" => "ইনস্টল",
"PluginBack" => "প্রত্যাবর্তন",
"PluginReadme" => "বিবরণ",
"PluginResetConfig" => "ডিফল্ট সেটিংস পুনরুদ্ধার করুন",
"PluginInstallSelf" => "ম্যানুয়াল ইনস্টলেশন",
"Plugin.config.auth" => "অনুমতিসমূহ",
"Plugin.config.authDesc" => "প্রাপ্তিসাধ্য সকল সেটিংস, অথবা নির্দিষ্ট ব্যবহারকারীদের ব্যবহারকারী গোষ্ঠী, অধিকার সংগঠনগুলো ব্যবহার করতে পারেন",
"Plugin.config.authOpen" => "অ্যাক্সেস খুলুন",
"Plugin.config.authOpenDesc" => "দেখার কোন প্রয়োজন অ্যাক্সেস করা যাবে না, বহিরাগত ইন্টারফেস কল জন্য ব্যবহার করা যেতে পারে",
"Plugin.config.authAll" => "ধারক",
"Plugin.config.authUser" => "ব্যবহারকারী",
"Plugin.config.authGroup" => "মনোনীত বিভাগ",
"Plugin.config.authRole" => "রাইটস গ্রুপ",
"Plugin.Config.openWith" => "ওপেন শৈলী",
"Plugin.Config.openWithDilog" => "অভ্যন্তরীণ ডায়ালগ",
"Plugin.Config.openWithWindow" => "নতুন পৃষ্ঠা খোলে",
"Plugin.Config.fileSort" => "এক্সটেনশন সমিতি অগ্রাধিকার",
"Plugin.Config.fileSortDesc" => "বৃহত্তর উচ্চ অগ্রাধিকার খুলতে এক্সটেনশন",
"Plugin.Config.fileExt" => "সমর্থিত ফাইল ফরম্যাট",
"Plugin.Config.fileExtDesc" => "প্লাগ-ইন যুক্ত এক্সটেনশন",
"Plugin.tab.basic" => "বেসিক সেটিং",
"Plugin.tab.auth" => "অনুমতিসমূহ",
"Plugin.tab.others" => "অন্যান্য সেটিংস",
"Plugin.default.aceEditor" => "টেক্কা সম্পাদক",
"Plugin.default.htmlView" => "ওয়েব পৃষ্ঠা পূর্বরূপ",
"Plugin.default.picasa" => "পিকাসা ছবি ব্রাউজিং",
"Plugin.default.zipView" => "Archive Preview",
"Plugin.default.jPlayer" => "jPlayer খেলোয়াড়",
"Plugin.auth.viewList" => "প্লাগইন তালিকা",
"Plugin.auth.setting" => "প্লাগইন সেটিংস",
"Plugin.auth.status" => "বন্ধ করুন",
"Plugin.auth.install" => "Install / Uninstall",
"Explorer.UI.openWith" => "ওপেন নির্বাচন করুন",
"Explorer.UI.openWithText" => "নোটপ্যাড খুলতে",
"Explorer.UI.appSetDefault" => "ডিফল্ট খোলা সেট",
"Explorer.UI.appAwaysOpen" => "সর্বদা এই ফাইল খোলার জন্য নির্বাচিত প্রোগ্রাম ব্যবহার",
"Explorer.UI.selectAppDesc" => "প্রোগ্রাম নির্বাচন করুন আপনি এই ফাইলটি খুলতে চান",
"Explorer.UI.selectAppWarning" => "দয়া করে আবেদন নির্বাচন করুন!",
"Explorer.UI.appTypeSupport" => "সমর্থিত",
"Explorer.UI.appTypeAll" => "সমস্ত অ্যাপ্লিকেশন",
"kodApp.oexe.edit" => "হালকা আবেদন সম্পাদনা করুন",
"kodApp.oexe.open" => "আলোর আবেদন খুলুন"
);
+33
View File
@@ -0,0 +1,33 @@
<div class="box">
<div class="title"><span>KODExplorer és Què?</span></div>
<p>KODExplorer és una gestió de documents en línia basat en la web de codi obert, editor de codi. Proporciona una mena d'interfície d'usuari de Windows clàssic, un joc de gestió de documents en línia, vista prèvia d'arxius, editar, carregar, descarregar, descomprimir la reproducció de música en línia. Li permet assolir el desenvolupament web directament al navegador, el codi font d'arxius de vista prèvia, i desplega el propietari del lloc i l'operació local tan fàcil, ràpida i segura experiència.</p>
<p><b>- disseny -</b></p>
<p>tradició clàssica, la recerca de la innovació, per proporcionar als usuaris convenient, segur i fàcil d'usar sistema de gestió del núvol en línia.</p>
<p>sempre que (quan), on (on), té la web sempre que ho desitgi (vol) és la seva eina de gestió (4W política).</p>
<p><b>-</b></p>
<p>Actualment sistema de gestió KODExplorer situada principalment en l'allotjament del núvol personal, petita - orientada als usuaris la gestió del núvol empresarial de recursos, gestió de discos de xarxa, gestió de llocs petits i mitjans. Web Developer i Màster (veterans): editor en línia, còpia de seguretat comprimida, desplegament, operació clàssica interfície de Windows, fàcil de començar i desfer-se de la SSH amfitrió, comanda ftp operacions de trepat complexes.</p>
<p>núvol personal privada, (novell): Gestió de recursos de disc de xarxa, el mateix funcionament de la interfície clàssica de Windows, es pot posar la unitat d'exploració de xarxa de música, arxius de pantalla, la càrrega i descàrrega ràpida i fàcil.</p>
</div>
<div class="box">
<div class="title"><span>característiques</span></div>
<p>gestió integral de documents, potent editor d'arxius en línia</p>
<p>allà on estigui, pot administrar els seus arxius, i d'entreteniment en línia, l'escriptura de codi en línia! Així com adequats per a ús com el sistema operatiu.</p>
<p>extensa experiència del trasplantament local d'operació de la dreta, arrossegament, caixa de selecció, accessos directes, cerca d'arxius (contingut de recerca) ......</p>
<p>quadre de selecció, moviment d'arrossegament, arrossegar i deixar anar la càrrega, editor en línia, reproductor de vídeo, descomprimir. Plena garantia d'execució ajax i l'experiència!</p>
<p>cada funció perfecta connexió directa, en forma de diàleg, les funcions de gestió multi-tasca</p>
<p>Editor suporta multi-document, el suport ZendCoding html, CSS, JS major eficiència de codificació!</p>
<p>suport xinès perfecte, il·legible resoldre diverses situacions;</p>
</div>
<div class="box">
<div class="title"><span>de codi obert adopció de tecnologia</span></div>
<p><b>1.Jquery:</b>jpuery (connector: Hotkeys.ztree.contentmenu) Js marc de desenvolupament del corrent principal. El funcionament de l'operació Dom, llista de materials, operació CSS, Ajax i el paquet</p>
<p><b>2.ArtDialog:</b>un disseny bonic, fort compatibilitat del navegador reproductor de diàleg. Així emergent mànec, esdeveniments i transmissió de dades per obtenir una millor gestió unificada</p>
<p><b>3.Ztree:</b>control de llista d'arbre, l'escalabilitat és molt giny de forta manipulació de dades d'arbre</p>
<p><b>4.codemirror:</b>un editor de codi js connectors, és compatible amb una varietat de llenguatges de programació per a posar en relleu</p>
<p><b>5.zendcoding:</b>uns codis html suport d'escriptura ràpida plug-ins. Simplifica la definició de codi està escrit. simple recopilació</p>
<p><b>6.less:</b>un model de desenvolupament css funcional eficient de millorar l'extrem frontal fulls d'estil CSS reutilització . simple recopilació</p>
<p><b>7.SWFUpload:</b>arxiu flash càrrega</p>
<p><b>8 .CMP4:</b>un molt bon flash player connector arxius multimèdia, suport per a streaming mitjana, molt popular eina de reproducció de vídeo de música. El suport a la pell, la configuració altament configurables. Llista dinàmics en XML carregat. mms mitjans de transmissió, llicència de codi obert compatible amb la reproducció de mitjans rstp</p>
</div>

Some files were not shown because too many files have changed in this diff Show More